Node.js异步循环,在下一个循环之前从函数回调

时间:2014-09-14 22:22:43

标签: javascript node.js asynchronous

我有一个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();
    });

}

2 个答案:

答案 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) {
    }
);