如何在async.js迭代器(节点)中添加延迟
我正在编写一个爬虫在Node,并发现了奇妙的async.js库。 我不想淹没我爬行的服务器。 所以我想在迭代之间引入一个延迟。 做这个的最好方式是什么? 我可以从setTimeout中的迭代器调用callback()吗?
由于使用Async库完成任何asynchronous任务总是通过调用完成callback来发出信号,所以您可以简单地通过将其放入setTimeout()
来延迟调用。 下面是一个例子,根据asynchronous文档中的示例进行了修改:
async.eachSeries(hugeArray, function iterator(item, callback) { doSomeIO(item, function(err, result) { setTimeout(function() { // process err or result here callback(err); }, 500); }); } }, function done() { //... });
这将工作,你可以使用Async系列像这样:
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(); });
- 在JavaScript中asynchronous迭代大量数组,而不会触发超出的堆栈大小
- 我可以指定如何处理asynchronousJavaScript库中的错误?
- Map-Reduce in Node
- Node + Sequelize:如何在添加之前检查项目是否存在? (asynchronous混淆)
- 当使用Node和jsdom到蜘蛛网站时,会导致内存不足
- 错误:callback已被调用 – asynchronousnode.js oracledb
- 编写async.parallel的testing。
- 将额外的parameter passing给asynchronous映射
- 每个asynchronous里面的nodejsasynchronous并行