nodejs中的setTimeout - for循环

时间:2014-12-09 20:26:56

标签: javascript node.js asynchronous

我查看过这篇文章:setTimeout in Node.js loop希望它能解决我的问题,并以某种方式解决。但是,我遇到了一个我无法自行解决的新问题。

过去几个小时我一直试图解决这个问题,但我没有运气。这就是我所拥有的:

需要在超时函数中调用的函数:

function searchLDAP(i, app, userUID){
    app.process_args(userUID[i]);
}

这是代码中无法正常工作的部分。该代码适用于第一次迭代(userUID[0]),但是当它尝试递归时,i变为undefined

function doSetTimeout(i, count, app, userUID) {
    if(i == count - 1){ callback(); }    
    searchLDAP(i, app, userUID);

    ++i;
    setTimeout(doSetTimeout, 2000);
}

我正在使用节点的异步模块

async.series([
    function(callback) {
        app.readLines(input, callback); // userUID is and array that 
                                        // is returned from this function
    },
    function() {
        var count = userUID.length;
        var i = 0;
        doSetTimeout(i, count, app, userUID);
    }
    ], function(err) {
        console.log('all functions complete');
});

提前谢谢

-Patrick

2 个答案:

答案 0 :(得分:1)

使用setTimeout,您只能命令调用哪个函数,但不传递函数应该使用的参数集。这是解决这个问题的一种可能方法:

function doSetTimeout(i, count, app, userUID) {
    if (i == count - 1) { 
      return; // you should stop the recursion
    }

    searchLDAP(i, app, userUID);

    setTimeout(function() {
      doSetTimeout(i + 1, count, app, userUID);
    }, 2000);
}

答案 1 :(得分:0)

作为raina77ow的答案的替代方案,您还可以更好地使用异步(并显着降低复杂性和代码行),如下所示:

app.readLines(input, function(err, users) {
    async.each(users, function(user, next) {
        app.process_args(user);
        next();
    }, function(err) {
        console.log('all functions complete');
    });
});

这将迭代您的每个用户(您发布的userUID数组),并将值传递给该函数。无需自己跟踪我的价值。这不受速率限制,并且没有setTimeout,只有在您的process_args方法无法处理并发调用时才需要。如果您需要确保一次只调用一个app.process_args,则可以改为使用eachSeries:

app.readLines(input, function(err, users) {
    async.eachSeries(users, function(user, next) {
        app.process_args(user);
        next();
    }, function(err) {
        console.log('all functions complete');
    });
});

如果由于某种原因你确实需要在两次通话之间延迟两秒钟,你可以执行以下操作:

app.readLines(input, function(err, users) {
    async.eachSeries(users, function(user, next) {
        setTimeout(function() {
            app.process_args(user);
            next();
        }, 2000);
    }, function(err) {
        console.log('all functions complete');
    });
});