初学者应该看的JavaScript Promise 完整指南

这篇文章算是 JAVAScript Promises 比较全面的教程,该文介绍了必要的方法,例如 then,catch和finally 。此外,还包括处理更复杂的情况,例如与Promise.all并行执行Promise,通过Promise.race 来处理请求超时的情况,Promise 链以及一些最佳实践和常见的陷阱 。
1.JavaScript PromisesPromise 是一个允许我们处理异步操作的对象,它是 es5 早期回调的替代方法 。
与回调相比,Promise 具有许多优点,例如:

  • 让异步代码更易于阅读 。
  • 提供组合错误处理 。* 更好的流程控制,可以让异步并行或串行执行 。
回调更容易形成深度嵌套的结构(也称为回调地狱) 。如下所示:
a(() => {  b(() => {    c(() => {      d(() => {        // and so on ...      });    });  });});如果将这些函数转换为 Promise,则可以将它们链接起来以生成更可维护的代码 。像这样:
Promise.resolve()  .then(a)  .then(b)  .then(c)  .then(d)  .catch(console.error);在上面的示例中,Promise 对象公开了.then和.catch方法,我们稍后将探讨这些方法 。
1.1 如何将现有的回调 API 转换为 Promise?我们可以使用 Promise 构造函数将回调转换为 Promise 。
Promise 构造函数接受一个回调,带有两个参数resolve和reject 。
  • Resolve:是在异步操作完成时应调用的回调 。
  • Reject:是发生错误时要调用的回调函数 。
构造函数立即返回一个对象,即 Promise 实例 。当在 promise 实例中使用.then方法时,可以在Promise “完成” 时得到通知 。让我们来看一个例子 。
Promise 仅仅只是回调?并不是 。承诺不仅仅是回调,但它们确实对.then和.catch方法使用了异步回调 。Promise 是回调之上的抽象,我们可以链接多个异步操作并更优雅地处理错误 。来看看它的实际效果 。
Promise 反面模式(Promises 地狱)a(() => {  b(() => {    c(() => {      d(() => {        // and so on ...      });    });  });});不要将上面的回调转成下面的 Promise 形式:
a().then(() => {  return b().then(() => {    return c().then(() => {      return d().then(() =>{        // ?? Please never ever do to this! ??      });    });  });});上面的转成,也形成了 Promise 地狱,千万不要这么转 。相反,下面这样做会好点:
a()  .then(b)  .then(c)  .then(d)超时你认为以下程序的输出的是什么?
const promise = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('time is up ?');  }, 1e3);  setTimeout(() => {    reject('Oops ');  }, 2e3);});promise  .then(console.log)  .catch(console.error);是输出:
time is up ?Oops! 还是输出:
time is up ?是后者,因为当一个Promise resolved 后,它就不能再被rejected 。
一旦你调用一种方法(resolve 或reject),另一种方法就会失效,因为 promise 处于稳定状态 。让我们探索一个 promise 的所有不同状态 。
1.2 Promise 状态Promise 可以分为四个状态:
  • ? Pending:初始状态,异步操作仍在进行中 。
  • ? Fulfilled:操作成功,它调用.then回调,例如.then(onSuccess) 。
  • ?? Rejected: 操作失败,它调用.catch或.then的第二个参数(如果有) 。例如.catch(onError)或.then(..., onError) 。
  • Settled:这是 promise 的最终状态 。promise 已经死亡了,没有别的办法可以解决或拒绝了 。.finally方法被调用 。
  •  

初学者应该看的JavaScript Promise 完整指南

文章插图
 
1.3 Promise 实例方法Promise API 公开了三个主要方法:then,catch和finally 。我们逐一配合事例探讨一下 。


推荐阅读