Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从节点REPL使用jsdom解析DOM_Javascript_Node.js_Dom_Jsdom - Fatal编程技术网

Javascript 如何从节点REPL使用jsdom解析DOM

Javascript 如何从节点REPL使用jsdom解析DOM,javascript,node.js,dom,jsdom,Javascript,Node.js,Dom,Jsdom,我正在尝试编写一些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,

我正在尝试编写一些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);

为什么代码无法分配
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);
});

@jsalonen我试图最终获得对应于
html
变量的DOM对象,并在其中进行一些树导航。这是一个SSCCE。也许有更好的方法可以使用
jsdom
获取DOM,我刚刚提出了这个
parse
函数,作为一种抽象
jsdom
逻辑的方法,并且有一种方法可以将值传递给调用上下文。好吧,这样做基本上,对象和参数
x
是多余的。是否有一种习惯用法可以用来将此异步接口转换为同步接口,如:
var window=parse(html)
?确实,您不需要将
x
作为参数传递给
parse
,因为它已经从外部范围可见。然而,编写类似于
var window=parse(html)
的代码需要您从异步转换为同步,这在node中通常是一个坏主意:除非您使用类似于节点光纤的东西(比如通过同步),否则您将阻止所有其他执行,直到同步解析完成。就我个人而言,我更愿意尝试遵循流程并采用异步编程风格——这是通常编写节点程序的方式。
...

function parse(html, x, done) {
    jsdom.env(html, function(errors, window) {
        x.window = window;
        done();
    });
}

var x = {};

parse(html, x, function() {
    console.log(x);
});