好的,下面的代码对我来说正常,这是我做异步循环的常用方法(count是异步)。所以在回调之前我记录了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个数字(预期的最后一个数字&#39; u&#39;,最后一个回调),而原则上它们应该是不同的,因为likesPartial数组每个步骤都有不同数量的元素。
这两个例子似乎与我类似,这就是我无法找到错误的原因。
感谢。
答案 0 :(得分:0)
在您的第一个示例中,您每次回调都会更新count
,当最后一次回调进入时,您正在callback
调用最终结果count
。这是有道理的。
您的第二个示例明显不同:它接收多个值,但忽略除最后一个之外的所有值(除了记录它们),然后仅使用最后一个{{1}调用callback
它收到了。所以它收到的前一个u
被丢弃了,这似乎没有意义(尤其是因为你不知道它是哪个u
,假设操作是异步的;它们可以按任何顺序完成。)
我注意到的另一件事是:
u
您每次都会传递profiles.count({ 'likes.id': { $in: likesPartial } }, function (err, u){
// ----------------------------^^^^^^^^^^^^^^^^^
的数组,而在您的第一个代码段中,您传递的是一个 ID ({{ 1}}),而不是数组。