延迟节点js中的每个循环迭代,asynchronous

我有下面的代码:

var request = require('request'); var cheerio = require ("cheerio"); var async= require("async"); var MyLink="www.mylink.com"; async.series([ function(callback){ request(Mylink, function (error, response, body) { if (error) return callback(error); var $ = cheerio.load(body); //Some calculations where I get NewUrl variable... TheUrl=NewUrl; callback(); }); }, function(callback){ for (var i = 0; i <=TheUrl.length-1; i++) { var url = 'www.myurl.com='+TheUrl[i]; request(url, function(error, resp, body) { if (error) return callback(error); var $ = cheerio.load(body); //Some calculations again... callback(); }); }; } ], function(error){ if (error) return next(error); }); 

有没有人有一个关于如何延迟for loop中的每个循环迭代的build议? 假设代码在每次迭代完成后等待10秒钟。 我试过setTimeout但没有pipe理的工作。

       

网上收集的解决方案 "延迟节点js中的每个循环迭代,asynchronous"

您可以像这样增加间隔来设置执行代码的超时时间:

 var interval = 10 * 1000; // 10 seconds; for (var i = 0; i <=TheUrl.length-1; i++) { setTimeout( function (i) { var url = 'www.myurl.com='+TheUrl[i]; request(url, function(error, resp, body) { if (error) return callback(error); var $ = cheerio.load(body); //Some calculations again... callback(); }); }, interval * i, i); } 

所以第一个马上跑(间隔* 0为0),第二个跑10秒后等。

您需要发送i作为setTimeout()的最后一个参数,以便它的值绑定到函数参数。 否则,尝试访问数组值将超出界限,您将得到undefined

由于您已经在使用async ,因此async.wilst可以很好地替代for

whilst是一个asynchronous的类似的function。 每次迭代只在前一次迭代调用完成callback后才运行。 在这种情况下,我们可以使用setTimeout简单地延迟执行完成callback10秒钟。

 var i = 0; async.whilst( // test to perform next iteration function() { return i <= TheUrl.length-1; }, // iterated function // call `innerCallback` when the iteration is done function(innerCallback) { var url = 'www.myurl.com='+TheUrl[i]; request(url, function(error, resp, body) { if (error) return innerCallback(error); var $ = cheerio.load(body); //Some calculations again... // wait 10 secs to run the next iteration setTimeout(function() { i++; innerCallback(); }, 10000); }); }, // when all iterations are done, call `callback` callback ); 

另一种select是使用async.eachSeries 。 例如:

 async.eachSeries(TheUrl, function (eachUrl, done) { setTimeout(function () { var url = 'www.myurl.com='+eachUrl; request(url, function(error, resp, body) { if (error) return callback(error); var $ = cheerio.load(body); //Some calculations again... done(); }); }, 10000); }, function (err) { if (!err) callback(); });