【问题标题】:how to parse a DOM with jsdom from a node REPL如何从节点 REPL 解析带有 jsdom 的 DOM
【发布时间】:2015-04-12 09:43:38
【问题描述】:

我正在尝试编写一些 DOM 解析代码以从 node REPL environment 运行。以下是 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属性失败?

【问题讨论】:

  • @jsalonen 我最终尝试获取与html 变量对应的DOM 对象并在其中进行一些树导航。这是一个SSCCE。也许有更好的方法来使用 jsdom 获取 DOM 我刚刚想出了这个 parse 函数作为抽象 jsdom 逻辑的一种方法,并有一种方法可以将值传达给调用上下文。

标签: javascript node.js dom jsdom


【解决方案1】:

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);
});

【讨论】:

  • OK 所以基本上,这样做,对象和参数x 是多余的。有没有一种习惯可以用来将此异步接口转换为同步接口,例如:var window = parse(html) ??
  • 是的,您不需要将x 作为参数传递给parse,因为它已经从外部范围可见。然而,编写像var window = parse(html) 这样的代码需要你从异步转换为同步,这在节点中通常是一个坏主意:除非你使用像节点光纤这样的东西(比如通过同步),否则你会阻止所有其他执行,直到同步解析完全的。就个人而言,我更愿意尝试顺其自然并采用异步编程风格——这是节点程序的典型编写方式。
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
相关资源
最近更新 更多