【问题标题】:Interaction of VO, Generators, Promises and return object.VO、Generators、Promises 和返回对象的交互。
【发布时间】:2016-01-18 12:30:25
【问题描述】:

我试图了解噩梦和 vo 是如何相互作用的。请在下面找到噩梦页面的(几乎)原始示例。

谁能给我一个提示如何找出发生的事情的顺序,即

  • 为什么生成器函数需要 yield 和 return 语句才能使代码工作
  • 如何通过 vo / nightmare 自动触发产量以使序列合理工作。背景是,我想知道何时将收益放在哪里,但是这里的收益语句似乎除了实际触发等待之外没有做任何其他事情。以我目前的知识,我可以在调用“.goto()”和“.end()”时复制示例并“等待”。

不幸的是,噩梦文档没有说明它的设计是如何工作的(与承诺和生成器的交互)。

如果有人能想到如何手动解决 run() 承诺并触发所有 .next() 以使生成器功能按预期工作所必需的示例,那么这已经是一个很大的帮助。

var Nightmare = require('nightmare');
var vo = require('vo');

vo( run() )(function(err, result) {
    if (err) throw err;
    console.log("end result length: ", result.length);
 });

function *run() {
    var x = Date.now();
    var nightmare = Nightmare();
    var html = yield nightmare
      .goto('http://google.com')
      .evaluate(function() {
        return document.getElementsByTagName('html')[0].innerHTML;
      });

   console.log("done in " + (Date.now()-x) + "ms");
   console.log("result:", html.length);

   yield nightmare.end();
   return html;
}

谢谢!

【问题讨论】:

  • 一条评论:这里的这段代码可以解决问题var nm = new run(); var result1Promise = nm.next().value.then(function(result1) { var result2Promise = nm.next(result1).value.then(function(result2) { nm.next(result2); }); });。但是,我不清楚为什么必须手动将收益结果传回生成器。

标签: javascript nightmare


【解决方案1】:

您需要按名称传递方法,而不是实际调用它。 Vo 将在运行时调用该方法。代码应该是

vo( run )(function(err, result) {
  if (err) throw err;
  console.log("end result length: ", result.length);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    相关资源
    最近更新 更多