【问题标题】:Asynchronously iterate through an array and then return the array?异步遍历数组然后返回数组?
【发布时间】:2017-07-06 11:21:13
【问题描述】:

我正在尝试异步迭代数组,然后想将值从被调用函数推送到新数组。

我有以下代码,但不知道如何处理...

let companies = [];
_.forEach(notProcessed, function(company) {
    companies.push(processThem(company));
});
return companies;

当然在打印/返回公司时,我会收到一个空数组。

提前感谢,感谢任何帮助!

【问题讨论】:

  • 如果processThem() 有异步代码,它需要创建promise 数组,但还需要processThem() 返回一个promise 以便将它的promise 推送到数组中。然后在承诺数组上使用Promise.all()
  • 显示processThem()的示例代码
  • I will receive an empty array - 不,你应该得到一个和notProcessed数组一样长的数组,只是数组中的值可能都是undefined,或者任何@987654329 @返回
  • 假设processThem() 中包含异步代码,我们需要查看实际功能来为您提供最佳帮助,因为这是您首先需要做一些不同的事情。请向我们展示该代码,以便我们提供帮助。

标签: javascript arrays node.js


【解决方案1】:

一种方法:

var notProcessed = ['a', 'b', 'c'];

function processThem(company) {
  // Example long process
  return new Promise((resolve) => {
    setTimeout(() => resolve(company), 500);
  });
}

function processArrayAsync(notProcessed) {
  var companies = [];
  var promise = Promise.resolve();
  for(let next of notProcessed) {
    promise = promise
      .then(() => processThem(next))
      .then(company => companies.push(company));
  }

  return promise.then(() => companies);
}

processArrayAsync(notProcessed).then(console.log);

还有一个更好的方法使用 es6 中的 new async 函数

var notProcessed = ['a', 'b', 'c'];

async function processThem(company) {
  // Example long process
  return new Promise((resolve) => {
    setTimeout(() => resolve(company), 500);
  });
}

async function processArrayAsync(notProcessed) {
  var companies = [];
  for(let next of notProcessed) {
    let res = await processThem(next);
    companies.push(res);
  }
  return companies;
}

processArrayAsync(notProcessed).then(console.log);

我真的很喜欢处理异步操作的第二种方式:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 2017-12-12
    • 1970-01-01
    • 2021-08-07
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多