【问题标题】:Asynchronous array problems异步数组问题
【发布时间】:2016-02-26 02:36:38
【问题描述】:

在您看到console.log(authors) 的外观接近尾声时,该数组不断地覆盖自身。这个循环的异步部分通常在循环之外。我这样做是为了调试为什么我得到一个充满相同用户名的大数组,而不是一个充满一系列不同用户名的数组的原因。这是我的代码:

while (i >= 0) {
  var search = User.find({'twitter.id' : collected[i].author});

  search.limit(1);
  searches.push(function(cb) {
    search.exec(function (err, hold){
      if (err) cb(err, null);
      else {
        cb(null, hold[0].twitter.username);
      }
    });
  });
  i = i - 1;

  async.parallel(searches, function( err, authors) {
    if ( err ) return console.error( err );
    else {
      console.log(authors);
    }
  });
}

这些是我得到的结果:

这是漫长的一天,我不太清楚自己哪里出错了。

【问题讨论】:

  • 你的逻辑不应该在User.find的回调函数中吗?如User.find({'twitter.id':collected[i].author}, function(user) { /* logic */ });
  • async.parallel 不应该在 while 循环之外吗?
  • @epascarello:“这个循环的异步部分通常在循环之外。我这样做是为了调试原因”
  • @nathanleung 我事先准备好了查询,它在执行时仍然以相同的方式工作。

标签: javascript arrays node.js asynchronous


【解决方案1】:

您没有清除搜索...

所以每次迭代都像这样:

  1. 在搜索中添加搜索
  2. 运行所有搜索(写入日志)

第一次迭代:第一次搜索。

第二次迭代:第一次搜索+第二次搜索。

第 3 次迭代:第 1 次搜索 + 第 2 次搜索 + 第 3 次搜索。

您可能想在 while 结束后运行 async.parallel()

【讨论】:

    【解决方案2】:

    问题在于,在调用任务函数 (function(cb) { ... }) 时,search 已经有一个不同的值,即上次迭代的值。所有任务都引用同一个search 变量,因此执行相同的搜索。

    这是典型的“闭环内循环”问题。

    您需要为每次迭代创建范围。解决方案见JavaScript closure inside loops – simple practical example

    【讨论】:

    • 你能举一个小例子来说明如何编码吗?
    • 链接问题中有很多例子。例如。 stackoverflow.com/a/19324832/218196.
    • 代码现在运行良好,非常快速的解决方案。学过的知识。闭包和作用域。
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 2017-12-26
    • 1970-01-01
    • 2018-12-09
    • 2017-12-31
    • 1970-01-01
    • 2010-12-16
    • 2014-10-05
    相关资源
    最近更新 更多