首页 > 解决方案 > async await Promise resolve 是否需要调用 .then() ?

问题描述

假设我有以下异步功能。只有在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不改变结果,但是这个线程回答了这个问题。

标签: javascriptasync-awaites6-promise

解决方案


能够处理异步操作而不总是诉诸thenasync/await. 第一个例子是完全有效的。

第二个有点反模式,因为它在功能上是相同的,没有async/await两个原因 - 用async隐式标记你的函数使它返回一个 Promise,但你也显式返回一个 - 并且awaiting Promise 导致代码等到Promise 在返回它之前解决,但是由于您与 链接then,因此then在 Promise 解决之前不会运行。

这在功能上是相同的:

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

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


推荐阅读