【发布时间】:2017-03-25 01:34:38
【问题描述】:
我正在尝试做一些在 NodeJS 中看起来相当简单的事情——我想一次运行一个函数。所有这些函数都有回调。我在下面概述了我的代码,以及它们运行的函数以供进一步参考。
我的问题是前两个工作得非常好 - 一次一个,但第三次迭代只是忽略了前两个函数,不管怎样。这导致了一个真正的问题,因为我的程序将对象放入数据库中,这会导致重复的对象。
总体目标是让每个函数一次运行一个。我在这里有什么遗漏吗?非常感谢您的帮助!
请注意,在下面的函数中,我已将所有参数简化为“args”以便于阅读。
调用函数:
addNewProject(args);
addNewProject(args);
addNewProject(args);
在函数内部,我运行这个:
function addNewProject(args) {
var info = args;
queue.push(function (done) {
loopThroughDetails(info, projID, 0, function () {
console.log('complete');
done(null, true);
});
});
}
这会调用 loopThroughDetails(),它是与 async.series() 一起使用的集成:
function loopThroughDetails(info, projID, i, callback) {
if (i < 500) {
getProjectDetails(projID + "-" + i, function (finished) {
if (JSON.stringify(finished) == "[]") {
info.ProjID = projID + "-" + i;
DB_COLLECTION_NAME.insert(info, function (err, result) {
assert.equal(err, null);
callback();
});
} else {
i++;
loopThroughDetails(info, projID, i, callback);
}
});
}
}
在调用完所有这些之后,我只是简单地使用 async.series 来完成任务:
async.series(queue, function () {
console.log('all done');
});
我在这里做错了什么?非常感谢您提供的任何帮助! :)
【问题讨论】:
-
您是否有理由像这样显式调用 addNewProject 方法?是否可以通过循环等迭代过程一次调用一个?例如,如果您只有一两个项目要添加怎么办?
标签: javascript node.js mongodb asynchronous async.js