梦魇在while循环中运行函数que(让循环等到que完成)

我试图在一个while循环中运行噩梦。 我的问题是while循环不等待噩梦完成。 这是我的示例代码:

var Nightmare = require('nightmare'); var Screenshot = require('nightmare-screenshot'); var i = 0; while(i < 10) { var nightmare = new Nightmare(); nightmare.goto('https:/website/?id='+ i); nightmare.screenshot('/home/linaro/cointellect_bot/screenshot1.png'); nightmare.use(Screenshot.screenshotSelector('screenshot' + i + '.png', 'img[id="test"]')); nightmare.run(); } 

是否有可能让循环等到噩梦完成它的function队列? 我还有什么其他的select?

使用函数而不是循环:

 var nightmare; var Nightmare = require('nightmare'); var Screenshot = require('nightmare-screenshot'); var runNext = function (i) { if (i < 10) { nightmare = new Nightmare(); nightmare.goto('https:/website/?id='+ i); nightmare.screenshot('/home/linaro/cointellect_bot/screenshot1.png'); nightmare.use(Screenshot.screenshotSelector('screenshot' + i + '.png', 'img[id="test"]')); nightmare.run(function () {runNext(i+1);}); } } runNext(0); 

nightmare.run根据这个文档接受callback: https : //github.com/segmentio/nightmare#runcb

作为parameter passing的函数被调用一次梦魇完成或错误。

这通常是nodejs中大部分asynchronous事物的工作方式。

虽然你需要提取一个函数,但最好不要只传入一个数字,而要使用完整的上下文。 你的function将因此看起来像

 var screenshotPage = function(data){ var nightmare = new Nightmare(); nightmare.goto(data.url); nightmare.use(Screenshot.screenshotSelector(data.filePath, data.selector)); nightmare.run(); } 

你应该可以像这样运行这个例子

 var Nightmare = require('nightmare'); var Screenshot = require('nightmare-screenshot'); var async = require('async') var pages = []; // You could do this recursively if you want for(var i=0; i < 10; i++) { pages.push({ url: 'https://website/?id='+ i, filePath: 'screenshot' + i + '.png', selector: 'img[id="test"]' }); } var screenshotPage = function(data, callback){ var nightmare = new Nightmare(); nightmare.goto(data.url); nightmare.use(Screenshot.screenshotSelector(data.filePath, data.selector)); nightmare.run(function(){ callback(null); }); } async.map(pages, screenshotPage, function(){ // Here all screenshotPage functions will have been called // there has been an error });