如何从节点 REPL 解析带有 jsdom 的 DOM
how to parse a DOM with jsdom from a node REPL
我正在尝试从 node REPL environment 编写一些 DOM 解析代码到 运行。下面是一个 SSCCE:
"use strict";
var jsdom = require("jsdom");
var html="<a></a>";
function parse(html, x) {
jsdom.env(html, function(errors, window) {
x.window = window;
});
}
var x = {};
parse(html, x);
console.log(x.window);
我的想法是,在调用 parse
函数后,我将在我的 x
对象中使用已解析的 DOM。
当我将上述代码放入文件 j.js
并从 REPL 加载它时,我得到:
> .load j.js
> "use strict";
'use strict'
> var jsdom = require("jsdom");
undefined
> var html="<a></a>";
undefined
> function parse(html, x) {
... jsdom.env(html, function(errors, window) {
..... x.window = window;
..... });
... }
undefined
> var x = {};
undefined
> parse(html, x);
undefined
> console.log(x.window);
undefined
undefined
>
为什么代码无法分配 x.window
属性?
jsdom.env
回调被异步评估。这意味着在大多数情况下(可能总是)console.log(x.window)
在 x.window = window;
赋值之前执行。
最简单的解决方法是传递一个在赋值后执行的回调函数:
...
function parse(html, x, done) {
jsdom.env(html, function(errors, window) {
x.window = window;
done();
});
}
var x = {};
parse(html, x, function() {
console.log(x);
});
我正在尝试从 node REPL environment 编写一些 DOM 解析代码到 运行。下面是一个 SSCCE:
"use strict";
var jsdom = require("jsdom");
var html="<a></a>";
function parse(html, x) {
jsdom.env(html, function(errors, window) {
x.window = window;
});
}
var x = {};
parse(html, x);
console.log(x.window);
我的想法是,在调用 parse
函数后,我将在我的 x
对象中使用已解析的 DOM。
当我将上述代码放入文件 j.js
并从 REPL 加载它时,我得到:
> .load j.js
> "use strict";
'use strict'
> var jsdom = require("jsdom");
undefined
> var html="<a></a>";
undefined
> function parse(html, x) {
... jsdom.env(html, function(errors, window) {
..... x.window = window;
..... });
... }
undefined
> var x = {};
undefined
> parse(html, x);
undefined
> console.log(x.window);
undefined
undefined
>
为什么代码无法分配 x.window
属性?
jsdom.env
回调被异步评估。这意味着在大多数情况下(可能总是)console.log(x.window)
在 x.window = window;
赋值之前执行。
最简单的解决方法是传递一个在赋值后执行的回调函数:
...
function parse(html, x, done) {
jsdom.env(html, function(errors, window) {
x.window = window;
done();
});
}
var x = {};
parse(html, x, function() {
console.log(x);
});