3

我正在使用这个框架来制作几个 url 的屏幕截图。截屏的过程是异步的,并且该方法没有提供执行回调的方法,我想在这个脚本上每次截屏时执行一个回调:

nightmare = new Nightmare();
urls.forEach(function (url) {
    nightmare.goto(url).screenshot(path);
});

nightmare.run(function () {
  console.log('finished all');
});

有什么想法我该怎么做?

4

2 回答 2

4

我找到了一种方法,使用“使用”方法执行插件。

nightmare = new Nightmare();
urls.forEach(function (url) {
    nightmare.goto(url).screenshot(path).use(function () {
        console.log('finished one');
    });
});

nightmare.run(function () {
    console.log('finished all');
});
于 2014-10-17T18:42:35.037 回答
3

这似乎是该run()方法的目的。您可能希望在循环中设置并运行每个屏幕截图,因为该screenshot()方法依赖于 phandomjs 方法render(),并且render()是严格同步的(至少在一年前):

urls.forEach(function (url) {
    nightmare = new Nightmare();
    nightmare.goto(url).screenshot(path).run(function(err, nightmare) {
        console.log('this executes when your screenshot completes');
        // run() appropriately tears down the nightmare instance
    });
});

console.log('finished all');

您不会从一次设置所有屏幕截图中获得任何异步好处,并且“完成所有”保证仅在渲染所有屏幕截图后运行。

或者,在 nightmarejs 源代码中,它看起来screenshot() 确实采用了done似乎是回调的第二个参数,但它直接将其传递给 phantomjsrender()方法,并且如上面的链接所示,允许该方法采用打回来。

于 2014-10-16T17:22:41.347 回答