2015-12-15 54 views
4

我正在Node中編寫爬網程序,並剛剛發現了奇妙的async.js庫。我想不要壓倒我抓取的服務器。所以我想在迭代之間引入一個延遲。做這個的最好方式是什麼?我可以從setTimeout中的迭代器調用callback()嗎?如何在async.js迭代器(節點)中添加延遲

+0

請顯示您的代碼的代表版本。在代碼的上下文中回答這樣的問題更方便。 – jfriend00

回答

3

由於與異步庫的異步任務的完成總是通過調用完成回調信號,你可以簡單地推遲調用,通過把它放在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() { 
    //... 
}); 
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(); 
});