VO,生成器,Promises和返回对象的交互。

时间:2016-01-18 12:30:25

标签: javascript nightmare

我正在努力了解噩梦和声音是如何互动的。请在下面找到噩梦页面的(几乎)原始示例。

任何人都可以给我一个提示,告诉我如何找出发生的事情的顺序,即

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

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

如果有人能够想到一个例子如何手动解析run()promise并触发所有.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;
}

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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