异步等待Promise解决是否需要调用.then()?

时间:2019-06-20 09:51:16

标签: javascript async-await es6-promise

假设我具有以下异步功能。 console.log仅在解决后才会触发。

(async () => {
  await new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, 1000);
  });
  console.log('resolved');
})();

这是有效的JavaScript吗?还是应该始终使用.then()?与在这里使用.then()相比,缺点或行为有何不同?

(async () => {
  return await new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, 1000);
  });
})().then(() => {
  console.log('resolved');
});

离题:我还注意到最新的方法return await可以更改为return而结果不变,但是this thread回答了这个问题。

1 个答案:

答案 0 :(得分:3)

then的要点是能够在不总是诉诸async/await的情况下处理异步操作。第一个例子是完全有效的。

第二个有点像反模式,因为没有async/await,它在功能上是相同的,这有两个原因-用async标记函数会隐式地使它返回Promise,但您也会显式返回一个-await和Promise一起执行会使代码等待直到Promise解析之后才返回它,但是由于您与then链接,因此then不会在Promise解析之前运行无论如何。

这在功能上是相同的:

(() => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, 1000);
  });
})().then(() => {
  console.log('resolved');
});

像第一个示例一样,使用“类似同步”的代码的主要缺点是错误处理-如果您连续执行5个await操作,但其中任何一个拒绝,则整个async函数都会返回被拒绝的承诺。如果链接then操作,也可以插入catch处理程序以更精确地处理特定的错误情况。