如何从节点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.envcallback得到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); });