Promise.all在异步函数中

时间:2019-08-14 17:15:14

标签: javascript ecmascript-6

我有2个密码

1个代码

   async function foo() {
  const result1 = asyncFunc1();
  const result2 = asyncFunc2();
  return [result1, result2];}

2个代码

async function foo() {
    const [result1, result2] = await Promise.all([
        asyncFunc1(),
        asyncFunc2(),
    ]);
return [result1,result2];}

问题 两者之间有什么区别吗?

3 个答案:

答案 0 :(得分:2)

作为注释状态,您没有等待第一个代码片段中的函数调用,因此您将获得Promise作为返回值。但是,如果您使用了wait,则主要区别在于在第一个代码段中,asyncFunc2在解析asyncFunc1之前不会被执行(假设您使用await) 。而在第二段中,asyncFunc2紧随asyncFunc1之后执行,无论它是否已解决。

Promise.all将按照传递函数的顺序返回结果。

请参阅Promise.AllAwait的文档

答案 1 :(得分:0)

根据注释,除了您没有等待两个异步函数的结果这一事实之外,两者基本上没有区别,因此您将只能得到promise对象。异步功能不会自动等待作用域内的承诺/异步代码,它们仅允许您使用await关键字,该关键字只是停止执行,直到底层承诺被解决为止。

这里尝试说明这些差异。

需要注意的重要一点是,第一个函数的返回值不是预期的1、2。

StoreObject

这是一个玩弄的小提琴; jsfiddle

答案 2 :(得分:-1)

只需找出答案!这是一个显示所有主要差异的代码段:

const timer = ms => new Promise(res => setTimeout(res, ms));

async function one() {
  console.log("1 one called");
  await timer(2000);
  console.log("1 one done");
}

async function two() {
  console.log("2 two called");
  await timer(1000);
  console.log("2 two done");
  // throw new Error; // Uncomment to see another interesting behaviour
}

(async function main() {
  const startParallel = Date.now();
  await Promise.all([one(), two()]);
  console.log(`parallel done, took ${Date.now() - startParallel}`);

  const startSerial = Date.now();
  await one();
  await two();
  console.log(`serial done, took ${Date.now() - startSerial}`);
})();