如何从节点REPLparsing带有jsdom的DOM
我正在尝试编写一些DOMparsing代码来运行节点REPL环境 。 以下是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
对象中parsing的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
callback得到asynchronous评估。 这意味着在大多数情况下(可能总是) console.log(x.window)
在x.window = window;
之前执行x.window = window;
分配。
最简单的解决方法是传递您在赋值之后执行的callback函数:
... function parse(html, x, done) { jsdom.env(html, function(errors, window) { x.window = window; done(); }); } var x = {}; parse(html, x, function() { console.log(x); });