【发布时间】:2017-05-19 17:19:01
【问题描述】:
好的,以下代码对我来说可以正常工作,这是我执行异步循环的常用方式(计数是异步的)。所以在回调之前,我会记录 3 个数字,原则上是不同的。
var arrayIds = ['a', 'b', 'c'];
var totalIds = arrayIds.length;
var done = 0;
var count = 0;
for (var i = 0; i < arrayIds.length; i++) {
mongoose.Model.count({ 'likes.id': arrayIds[i] }, function (err, c) {
count += c;
console.log(c);
if (++done < totalIds) return; //else
callback(count);
})
}
但我不知道在其他情况下发生了什么,具有相同的理念,请帮助:
var arrayIds = ['a', 'b', 'c'];
var totalIds = arrayIds.length;
var done = 0;
var likesPartial = [];
for (var m = 0; m < arrayIds.length; m++) {
likesPartial.push(arrayIds[m]);
profiles.count({ 'likes.id': { $in: likesPartial } }, function (err, u){
console.log(u);
if (++done < totalIds) return; //else
callback(u);
})
}
问题是我记录了相同的 3 个数字(预期最后一个 'u' 的值,最后回调的那个),而原则上它们应该是不同的,因为 likesPartial 数组在每一步都有一个不同数量的元素。
这两个例子对我来说似乎很相似,这就是我找不到错误的原因。
谢谢。
【问题讨论】:
-
我不认识猫鼬,但
for不能是async。您可以查看递归以进行循环。 -
第二个例子想要做什么?
-
严格来说,我想你的意思是“因为里面不能有异步函数”。在这种情况下,我说“不”。示例 1 有效。我不确定这是做事的最佳方式,但可以这样做
-
警长:@Rajesh 说得对,
for循环不能是异步的,但这并不意味着它们不能启动 一系列异步操作。 :-) 您使用上面的for就可以了。 -
T.J.我的代码在这里被简化了。我只是希望第二个代码记录 3 个不同的数字,并且记录相同的数字 3 次
标签: javascript asynchronous mongoose