Ecmascript 6 为什么等待作为回报时有不同的行为?

Ecmascript 6 为什么等待作为回报时有不同的行为?,ecmascript-6,async-await,Ecmascript 6,Async Await,我在这里阅读Wait的示例: 它有两个不同的使用它的例子。然而,它没有提到行为是不同的 以下代码: function resolveAfterXSeconds(x, secs) { return new Promise(resolve => { setTimeout(() => { console.log("Resolving ",secs) resolve(x); }, secs * 1000); }); } async fun

我在这里阅读Wait的示例: 它有两个不同的使用它的例子。然而,它没有提到行为是不同的

以下代码:

function resolveAfterXSeconds(x, secs) {
  return new Promise(resolve => {
    setTimeout(() => {
        console.log("Resolving ",secs)
      resolve(x);
    }, secs * 1000);
  });
}

async function add(x) {
  const a = await resolveAfterXSeconds(20,4);
  const b = await resolveAfterXSeconds(30,3);
  return x + a + b;    
}

add(10).then(v => {
  console.log(v);
});
印刷品:

解析4
解析3
六十

但是如果我修改
添加到以下内容:

async function add(x) {
  const p_a = resolveAfterXSeconds(20,4);
  const p_b = resolveAfterXSeconds(30,3);
  return x + await p_a + await p_b;
}
它打印以下内容(无论变量的顺序如何):

解析3
解析4
六十


为什么数字以不同的顺序打印?

在第一个版本中,第一个
resolveAfterXSeconds
函数调用返回一个等待的承诺,即在承诺得到解决之前,不会执行该
add
函数中的任何其他代码。只有这样,下一个调用才会在xseconds
之后进行

在第二种变体中,两个
resolveAfterXSeconds
函数调用会立即进行,而无需等待。因此,
setTimeout
都将执行,第一个调用其回调的是具有较小延迟参数的回调。因此,第二个承诺(使用
secs
值3)将比第一个承诺(使用
secs
值4)更快解决

您仍在等待这两个承诺的事实,并不会改变它们解决的时刻(并打印到控制台)


简言之,不同之处在于,在第一个版本中,第二个承诺直到第一个承诺得到解决后才会产生。在第二种情况下,两种承诺同时产生。第一个版本需要4+3秒才能完成,第二个版本需要最多(4,3)秒才能完成。

在第一个版本中,第一个
resolveAfterXSeconds
函数调用返回一个等待的承诺,即在该承诺得到解决之前,
add
函数中没有其他代码被执行。只有这样,下一个调用才会在xseconds
之后进行

在第二种变体中,两个
resolveAfterXSeconds
函数调用会立即进行,而无需等待。因此,
setTimeout
都将执行,第一个调用其回调的是具有较小延迟参数的回调。因此,第二个承诺(使用
secs
值3)将比第一个承诺(使用
secs
值4)更快解决

您仍在等待这两个承诺的事实,并不会改变它们解决的时刻(并打印到控制台)


简言之,不同之处在于,在第一个版本中,第二个承诺直到第一个承诺得到解决后才会产生。在第二种情况下,两种承诺同时产生。第一个版本需要4+3秒才能完成,第二个版本最多需要4,3秒秒完成。

您将等待从通过
const
声明函数时移动到
return
语句,因此解析以不同的顺序进行。您将等待从通过
const
声明函数时移动到
return
语句,因此解析以不同的顺序进行不同的顺序。