Javascript 异步for循环

Javascript 异步for循环,javascript,asynchronous,mongoose,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': arr

好的,下面的代码对我来说是正确的,这是我做异步循环的常用方法(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计数=0;
对于(var i=0;i
但我不知道在另一个案例中发生了什么,本着同样的理念,请帮助:

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);
    })
}
var arrayIds=['a','b','c'];
var totalIds=arrayIds.length;
var done=0;
var likesPartial=[];
对于(var m=0;m
问题是,我记录了相同的3个数字(预期的最后一个'u'的值,即最后调用的'u'),但原则上它们应该不同,因为像partial array一样,每个步骤都有不同数量的元素

这两个例子对我来说似乎很相似,这就是为什么我找不到错误


谢谢。

在您的第一个示例中,您正在使用每个回调更新
count
,当最后一个回调到来时,您正在调用
callback
,最终结果为
count
。这是有道理的

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


我注意到的另一件事是:

profiles.count({ 'likes.id': { $in: likesPartial } }, function (err, u){
// ----------------------------^^^^^^^^^^^^^^^^^

您每次都在传递数组,比如partial
,而在第一个代码段中,您传递的是单个ID
arrayIds[i]
),而不是数组。

在第一个示例中,您正在使用每个回调更新
count
,当最后一个回调到来时,您正在调用
callback
,最终结果为
count
。这是有道理的

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


我注意到的另一件事是:

profiles.count({ 'likes.id': { $in: likesPartial } }, function (err, u){
// ----------------------------^^^^^^^^^^^^^^^^^


您每次都要传递数组,比如部分
,而在您的第一个代码段中,您传递的是单个ID
arrayIds[i]
),不是数组。

我不知道mongoose,但是
for
不能是
异步的。您可以研究循环的递归。您希望第二个示例做什么?严格地说,我想您的意思是“for不能包含异步函数”。在这种情况下,我说“不”。例1有效。我不确定这是做事情的最佳方式,但可以这样做警长:@Rajesh说得对,for的
循环不能是异步的,但这并不意味着它们不能启动一系列异步操作。:-)您对上面的
使用
就可以了。我的代码在这里被简化了。我只希望第二个代码记录3个不同的数字,同一个数字记录3次我不知道mongoose,但是
for
不能是
async
。您可以研究循环的递归。您希望第二个示例做什么?严格地说,我想您的意思是“for不能包含异步函数”。在这种情况下,我说“不”。例1有效。我不确定这是做事情的最佳方式,但可以这样做警长:@Rajesh说得对,for的
循环不能是异步的,但这并不意味着它们不能启动一系列异步操作。:-)您对上面的
使用
就可以了。我的代码在这里被简化了。我只希望第二个代码记录3个不同的数字,相同的数字记录3次OK,它们不是完全相似的。2在这方面,u的值不会被回调和丢失。但是关于日志,我应该有3个不同的日志,就像第一个例子一样,对吗?@警长:是的。这并不意味着它们不可能都具有相同的值。@警长:您还在调用中传递一个明显不同的参数,请参见上面的更新。我希望代码2只记录3个不同的值。是的not@sheriff当前位置您是否看到我关于您传递的内容的便条,以及它与您在第一次呼叫中传递的内容有何不同?我可以看到这样一种情况:它最终只返回数组中第一个条目的
u
值……好吧,它们并不完全相似。2在这方面,u的值不会被回调和丢失。但是关于日志,我应该有3个不同的日志,就像第一个例子一样,对吗?@警长:是的。这并不意味着它们不可能都具有相同的值。@警长:您还在调用中传递一个明显不同的参数,请参见上面的更新。我希望代码2只记录3个不同的值。是的not@sheriff当前位置您是否看到我关于您传递的内容的便条,以及它与您在第一次呼叫中传递的内容有何不同?我可以看到这样一个场景,它最后只剩下e