async await Promise resolve 是否需要调用 .then()?

Does an async await Promise resolve require .then() to be called?

假设我有以下异步函数。 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而不改变结果,但是回答了那个问题。

能够处理异步操作而不总是求助于thenasync/await的要点。第一个例子完全有效。

第二个有点反模式,因为它在没有 async/await 的情况下在功能上是相同的,原因有二——用 async 标记你的函数隐含地使它成为 return 一个 Promise ,但您还明确 return 一个 - 并且 awaiting Promise 导致代码在 returning 之前等待 Promise 解决,但由于您正在链接 then , then 不会 运行 在 Promise 解决之前。

这在功能上是相同的:

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

像第一个示例那样使用 "synchronous-like" 代码的主要缺点是错误处理 - 如果您连续执行 5 个 await 操作并且其中任何一个被拒绝,您的整个 async函数 return 是一个被拒绝的 Promise。如果您链接 then 个操作,您还可以插入 catch 个处理程序来更精确地处理特定的错误情况。