Node.jsasynchronous循环,从下一个循环前的函数callback

我有一个async.whilst循环,在每个循环中循环一个名为hashtag的string数组。

在for循环中, searchTwitter()函数被触发。 我需要for循环暂停,直到从searchTwitter()函数返回一个callback,然后暂停2秒,然后for循环继续到hashtag数组中的下一个string传递给searchTwitter()

在循环结束之后,async.whilst循环中有一个超时,持续10秒,while循环再次重新加载for循环。

我下面的代码立即触发所有的searchTwitter()函数,而无需等待callback或setTimeout(callback,2000)

 async.whilst( function () { return 0 == 0 }, function (callback) { for (var i = 0; i < hashtag.length; i++) { searchTwitter(hashtag[i]); setTimeout(callback, 2000); } setTimeout(callback, 10000); }, function (err) { } ); function searchTwitter(tag, callback){ T.get('search/tweets', { q: '#fun', count: 100 }, function(err, data, response) { console.log(data); callback(); }); } 

就像@Anatoliy在他的回答中提到的, async.eachSeries将会帮助你进行循环。 它会遍历你的hashtag数组,只有在你调用callback函数后才调用下一个项目。

实现这些延迟的诀窍是在searchTwitter的callbacksearchTwittersearchTwitter的完成callback函数中调用setTimeout函数。 像这样:

 async.whilst( function () { return true }, // true makes more sense than 0 == 0, especially from a readability standpoint function (callback) { async.eachSeries(hashtag, function(tag, callback) { searchTwitter(tag, function() { setTimeout(callback, 2000); // Wait 2 seconds before going on to the next tag }) }, function(err) { setTimeout(callback, 10000); // Wait 10 seconds before looping over the hashtags again }); }, function (err) { } ); 
 async.whilst( function () { return 0 == 0 }, function (callback) { async.eachSeries(hashtag, searchTwitter, callback); }, function (err) { } ); function searchTwitter(tag, done) { // search for `tag` // call `done` when done } 

阅读文档: async#eachSeries