【问题标题】:Asynchronous for loop异步 for 循环
【发布时间】: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


【解决方案1】:

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

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


我注意到的另一件事是:

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

您每次都在 likesPartialarray 中传递,而在您的第一个代码 sn-p 中,您传递的是单个 ID (@987654330 @),而不是数组。

【讨论】:

  • 好吧,它们并不完全相似。 u 的 2 个值不会在这方面被回调和丢失。但是关于日志,我应该以与第一个示例相同的方式拥有 3 个不同的日志,不是吗?
  • @sheriff:是的。这并不意味着它们不可能碰巧都具有相同的价值。
  • @sheriff:您还在调用中传递了一个明显不同的参数,请参阅上面的更新。
  • 我希望代码 2 唯一能做的就是记录 3 个不同的值。它没有
  • @sheriff:你看到我关于你传入的内容的注释了吗?它与你在第一次通话中传入的内容有何不同?我可以看到一个场景,它最终只返回数组中第一个条目的 u 值...
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 2019-03-22
  • 2021-02-21
  • 2020-06-14
  • 2019-02-15
相关资源
最近更新 更多