我有一个async.whilst
循环,它在每个循环中循环遍历一个名为hashtag
的字符串数组。
在for循环期间,searchTwitter()
函数被触发。我需要for循环暂停,直到从searchTwitter()
函数返回一个回调,然后暂停2秒,然后for循环继续到hashtag
数组中的下一个字符串传递给searchTwitter()
。
for循环完成后,async.whilst循环中有超时,持续10秒,然后while循环再次重新加载for循环循环。
下面的代码会立即触发所有searchTwitter()
函数,而无需等待回调或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();
});
}
答案 0 :(得分:2)
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
答案 1 :(得分:1)
就像他在答案中提到的@Anatoliy一样,async.eachSeries
将帮助你解决这个问题。它将遍历您的hashtag
数组,仅在您调用callback
函数后调用下一个项目。
实现这些延迟的诀窍是在setTimeout
的回调中调用searchTwitter
个函数,从eachSeries
调用完成回调。像这样:
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) {
}
);