我查看过这篇文章: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
答案 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');
});
});