【问题标题】:How to add a delay in async.js iterator (Node)如何在 async.js 迭代器(节点)中添加延迟
【发布时间】:2023-04-07 15:38:01
【问题描述】:

我正在用 Node 编写一个爬虫,刚刚发现了奇妙的 async.js 库。我不想让我爬的服务器不堪重负。所以我想在迭代之间引入延迟。做这个的最好方式是什么?我可以从 setTimeout 内的迭代器中调用 callback() 吗?

【问题讨论】:

  • 请出示您的代码的代表版本。在代码的上下文中回答这样的问题会更容易。

标签: node.js async.js


【解决方案1】:

这行得通,你可以像这样使用异步系列:

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();
});

【讨论】:

    【解决方案2】:

    由于使用 Async 库的任何异步任务的完成总是通过调用完成回调来发出信号,因此您可以通过将其放入 setTimeout() 来简单地延迟调用它。这是一个示例,改编自异步文档中的示例:

    async.eachSeries(hugeArray, function iterator(item, callback) {
        doSomeIO(item, function(err, result) {
            setTimeout(function() {
                // process err or result here
                callback(err);
            }, 500);
        });
      }
    }, function done() {
      //...
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多