Javascript 如何从节点REPL使用jsdom解析DOM
我正在尝试编写一些DOM解析代码,以便从数据库运行。以下是SSCCE: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,
"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);
});