繁体   English   中英

NodeJS Promise.all在等待所有组件完成之后再继续

[英]NodeJS Promise.all is waiting for all components to finish before continuing

我正在尝试处理由对象组成的数组。 每个对象都有一个字段,其值是数字数组。 我想以异步/等待方式处理所有数字数组的所有组件。

数据的示例是这样的:

const data = [{
  numbers: [1, 2, 3],
}, {
  numbers: [4, 5, 6],
}, {
  numbers: [7, 8, 9],
}];

我已经通过两种方式实现了此功能。 第一个代码是这样的:

const processData1 = async(data) => {
  return Promise.all(data.map(async(d) => {
    const partial = await Promise.all(d.numbers.map(async(n) => {
      console.log('INIT', n);
      const number = await processNumber(n);
      console.log('END', n);
      return number;
    }));
    return partial;
  }));
};

第二个是:

const processData2 = async(data) => {
  for (const d of data) {
    for (let n of d.numbers) {
      console.log('INIT', n);
      n = await processNumber(n);
      console.log('END', n);
    }
  }
};

在所有情况下,我期望控制台中打印的都是正确顺序的“ INIT”和“ END”。 在第二个代码函数中也是如此。 但是在第一个中,我看到的INIT和数字一样多,然后所有对应的END:

**** processData1 ****
INIT 1
INIT 2
INIT 3
INIT 4
INIT 5
INIT 6
INIT 7
INIT 8
INIT 9
END 1
END 2
END 3
END 4
END 5
END 6
END 7
END 8
END 9
**** processData2 ****
INIT 1
END 1
INIT 2
END 2
INIT 3
END 3
INIT 4
END 4
INIT 5
END 5
INIT 6
END 6
INIT 7
END 7
INIT 8
END 8
INIT 9
END 9

这怎么可能? 为什么await processNumber等待所有数字被解析?

在第一个示例中,您仅等待Promise.all的结果, Promise.all意味着每个promise在同一时间执行。 在第二个示例中,您等待每个单独的诺言,这将迫使他们依次执行。

两种情况都有其用途,第一种情况更好,如果您不关心顺序,即操作可以并发运行,第二种情况对于强制异步代码按顺序执行很有用。

MDN

Promise.all(iterable)方法返回一个Promise,当可迭代参数中的所有promise已解决或可迭代参数不包含promise时,该Promise进行解析。 它以第一个承诺被拒绝的理由拒绝。

这意味着传递的承诺全部并行执行,并且仅在所有承诺结束时才能完成和解决。 在您的示例中,子承诺被授予按顺序启动。 在您的情况下,它们碰巧以相同的顺序结束,但这不一定能保证(一个可能比另一个花费更长的时间,然后再结束)。

对于第二个示例,您要做的就是启动并立即等待for循环内的每个单个processNumber(n) ,从而导致每个进程都按顺序开始和结束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM