这篇文章算是 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 仅仅只是回调?并不是 。承诺不仅仅是回调,但它们确实对.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方法被调用 。
文章插图
1.3 Promise 实例方法Promise API 公开了三个主要方法:then,catch和finally 。我们逐一配合事例探讨一下 。
推荐阅读
- 经期喝枸杞茶可以吗,经期能喝菊花茶吗,经期应该避免喝菊花茶
- 进故宫旅游应该先从什么地方进 游故宫要注意的事情是什么
- 喝茶应该配什么茶点,个茶壶配应该配几个茶杯
- 口腔溃疡应该吃什么好 口腔溃疡药膳调理食疗方
- 女生单身戒指应该戴在哪个手指
- 神经性厌食
- 青少年体育运动应该注意什么
- 出现虚胖应该如何减肥?
- 运动健身计划应该怎么实施?
- 高考语文最后阶段应该如何冲刺提分