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
的callbacksearchTwitter
和searchTwitter
的完成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