Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在while循环中运行函数que(让循环等待直到que完成)_Javascript_Node.js_Nightmare - Fatal编程技术网

Javascript 在while循环中运行函数que(让循环等待直到que完成)

Javascript 在while循环中运行函数que(让循环等待直到que完成),javascript,node.js,nightmare,Javascript,Node.js,Nightmare,我试图在一个循环中运行噩梦。我的问题是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)

我试图在一个循环中运行噩梦。我的问题是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();
}
var噩梦=require(“噩梦”);
var Screenshot=require(‘梦魇截图’);
var i=0;
而(i<10){
var噩梦=新噩梦();
goto('https:/website/?id='+i);
屏幕截图('/home/linaro/cointellect_bot/screenshot1.png');
使用(Screenshot.screenshotSelector('Screenshot'+i+'.png','img[id=“test”]');
噩梦。运行();
}

是否可以让循环等待直到噩梦完成它的函数队列?我还有什么其他选择?

使用函数而不是循环:

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);
var噩梦;
var噩梦=需要(“噩梦”);
var Screenshot=require(‘梦魇截图’);
var runNext=函数(i){
如果(i<10){
噩梦=新的噩梦();
goto('https:/website/?id='+i);
屏幕截图('/home/linaro/cointellect_bot/screenshot1.png');
使用(Screenshot.screenshotSelector('Screenshot'+i+'.png','img[id=“test”]');
run(函数(){runNext(i+1);});
}
}
runNext(0);
噩梦。运行
根据以下文档接受回调:

作为参数传递的函数在噩梦完成或出错后被调用


这通常是NodeJ中大多数异步事物的工作方式。

当您需要提取一个函数时,可能最好不只是传递一个数字,而是传递整个上下文。因此,您的函数将如下所示

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
});
var噩梦=require(“噩梦”);
var Screenshot=require(‘梦魇截图’);
var async=require('async')
var页面=[];
//如果需要,可以递归地执行此操作
对于(变量i=0;i<10;i++){
页面推送({
网址:'https://website/?id="我,,
文件路径:'screenshot'+i+'.png',
选择器:“img[id=“test”]”
});
}
var screenshotPage=函数(数据、回调){
var噩梦=新噩梦();
goto(data.url);
使用(Screenshot.screenshotSelector(data.filePath,data.selector));
run(function()){
回调(空);
});
}
map(页面、屏幕快照页面、函数(){
//这里将调用所有screenshotPage函数
//出现了一个错误
});

这不是我的反对票。这对我有用,谢谢!我会尽快接受。使用回调强制函数串联使用对我来说是个问题。此外,使用的停止条件可能是错误的使用条件。(换个说法很容易)。如果使用一个数字作为参数,那么我希望调用
nextRun(10)
而不是
nextRun(0)
。最后,
nextRun
可能会有一个更好的名字。