异步循环

时间:2017-01-05 08:32:43

标签: javascript asynchronous mongoose

好的,下面的代码对我来说正常,这是我做异步循环的常用方法(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数组每个步骤都有不同数量的元素。

这两个例子似乎与我类似,这就是我无法找到错误的原因。

感谢。

1 个答案:

答案 0 :(得分:0)

在您的第一个示例中,您每次回调都会更新count,当最后一次回调进入时,您正在callback调用最终结果count。这是有道理的。

您的第二个示例明显不同:它接收多个值,但忽略除最后一个之外的所有值(除了记录它们),然后仅使用最后一个{{1}调用callback它收到了。所以它收到的前一个u被丢弃了,这似乎没有意义(尤其是因为你不知道它是哪个u,假设操作是异步的;它们可以按任何顺序完成。)

我注意到的另一件事是:

u

您每次都会传递profiles.count({ 'likes.id': { $in: likesPartial } }, function (err, u){ // ----------------------------^^^^^^^^^^^^^^^^^ 数组,而在您的第一个代码段中,您传递的是一个 ID ({{ 1}}),而不是数组。