【问题标题】:Calling async functions from within synchronous loops & keeping the results ordered从同步循环中调用异步函数并保持结果有序
【发布时间】:2020-06-27 13:05:21
【问题描述】:
async function processArray(array) {
  let myOrderedArray = [];

  for (const item of array) {
    const value = await getValue(item);
    myOrderedArray.push(value);
  }

  return myOrderedArray;
}

我想遍历数组,为每个项目执行一个异步操作,然后将我得到的值保存在不同的数组中。这个结果数组是有序的:我希望item1 的结果值出现在结果中的位置1,在item2 之前,依此类推。

但是,这些是异步调用。我不能确定我的异步函数调用是否以完全相同的顺序返回,因为它们是同步的。我怎样才能实现这样的目标?

【问题讨论】:

标签: javascript node.js loops asynchronous async-await


【解决方案1】:
async function processArray(array) {

  return array.map(async item => {
    return await getValue(item);
  })
}

promise 中的promise 是有序的

【讨论】:

    【解决方案2】:

    您的代码已经保证它们会井井有条,但是这样做的速度很慢。您的代码将运行直到第一次等待,然后阻塞直到它获得值。只有当它有第一个值时才会循环,然后再次阻塞第二个值。

    如果您想并行执行它们,那么您需要创建一个 promise 数组,并使用 Promise.all 等待它们全部完成。

    async function processArray(array) {
      const promises = array.map(item => getValue(item));
      const myOrderedArray = await Promise.all(promises);
      return myOrderedArray;
    }
    

    如果您没有对进程数组中的 myOrderedArray 做任何事情,那么您可以将其简化为:

    function processArray(array) {
      const promises = array.map(item => getValue(item));
      return Promise.all(promises);
    }
    

    【讨论】:

      【解决方案3】:

      由于您正在等待getValue 函数,因此尽管是异步调用,但仍将保持顺序。直到第一次调用成功时才会调用 push 函数。 for...of 循环尊重异步承诺代码。

      【讨论】:

        猜你喜欢
        • 2022-12-06
        • 2016-05-14
        • 2019-07-02
        • 1970-01-01
        • 2019-09-30
        • 1970-01-01
        • 2015-04-18
        • 2012-07-25
        • 1970-01-01
        相关资源
        最近更新 更多