ES7 之 Promise 对象详解

Promise 是 ES6 引入的一个新的异步编程解决方案,可以更好地解决回调地狱问题,ES7 在 Promise 基础上做了一些改进,本文将详细讲解 ES7 中 Promise 对象的用法和注意事项。

Promise 是什么

Promise 是一种能够更好处理异步编程的编程范式。在传统的异步回调函数中,我们通过嵌套函数的方式处理异步代码,这种写法存在嵌套过多、可读性差、错误处理困难等问题。而 Promise 可以帮助我们更好地组织异步代码,提高可读性和可维护性。

Promise 有三种状态:pending(进行中)、resolved(已完成,又称 resolved 或者 fulfilled)和 rejected(已失败)。当 Promise 对象的状态改变时,会触发相应的回调函数。

Promise 的用法

Promise 的基础用法

创建一个 Promise 对象:

const promise = new Promise(function(resolve, reject) {
  // 异步逻辑
  let success = true;
  if (success) {
    resolve('成功');
  } else {
    reject('失败');
  }
});

Promise 对象创建时需要传入一个函数作为参数,该函数有两个参数:resolvereject。如果异步逻辑顺利执行,可以调用 resolve 函数并传入成功的值,如果出现异常则调用 reject 函数并传入错误信息。

使用 Promise 对象:

promise.then(function(successMessage) {
  console.log(successMessage);
}).catch(function(errorMessage) {
  console.error(errorMessage);
});

使用 then 方法可以注册成功回调函数,使用 catch 方法可以注册失败回调函数。当 promise 被 resolve 时,将会调用 then 中注册的回调函数;当 promise 被 reject 时,将会调用 catch 中注册的回调函数。

Promise.all

Promise.all 方法接收一个 Promise 数组作为参数,返回一个新的 Promise 对象。当所有的 Promise 对象都 fulfilled 时,返回的 Promise 对象将被 resolved,如果有一个或多个 Promise 对象 rejected,则返回的 Promise 对象将被 rejected,这时只有第一个被 rejected 的 Promise 的错误信息被传入 catch 中。

Promise.all([
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.resolve(3)
]).then(function(result) {
  console.log(result);  // [1, 2, 3]
});

Promise.all([
  Promise.resolve(1),
  Promise.reject('出错了'),
  Promise.resolve(3)
]).catch(function(error) {
  console.error(error);  // 出错了
});

Promise.race

Promise.all 相反,Promise.race 接收一个 Promise 数组作为参数,但只要有一个 Promise 对象 fulfilled 或 rejected,将返回这个 Promise 对象的值或错误信息。

Promise.race([
  new Promise(function(resolve) {
    setTimeout(() => resolve('当前放送节目'), 1000);
  }),
  new Promise(function(_, reject) {
    setTimeout(() => reject('出现异常'), 500);
  })
]).then(function(res) {
  console.log(res);  // '出现异常'
}).catch(function(err) {
  console.error(err); // '出现异常'
});

Promise.finally

Promise.prototype.finally 方法用于给 Promise 对象添加一个回调函数,该回调函数无论 Promise 对象最终状态如何都会执行。该方法不接受任何参数,不能改变 Promise 对象的状态。

Promise.resolve('done')
  .finally(() => console.log('finally'))
  .then(result => console.log(result)); // 'done', 'finally'

Promise 的注意事项

Promise 对象状态不可逆

一旦 Promise 对象的状态改变,就不能再次改变。如果不声明 reject 回调函数,当出现错误时 Promise 对象的状态将一直停留在 pending 状态,无法执行成功回调函数。

Promise 使用场景

Promise 适用于一次异步操作,例如使用 Ajax 获取数据或者执行异步任务。Promise 不适用于多次异步操作的情景,例如循环等待多个 Promise 对象的结果。

Promise.resolve

当传递给 Promise.resolve 的参数为 Promise 对象时,Promise.resolve 的返回值与传入对象相同。

Promise.resolve(Promise.resolve('done')).then(res => console.log(res)); // 'done'

总结

本文对 ES7 中 Promise 对象进行了详细的分析,介绍了 Promise 的基础用法、Promise.all、Promise.race、Promise.finally 和 Promise 的注意事项。通过学习 Promise 对象的用法,可以更好地编写异步代码,提高代码的可读性和可维护性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659e37a3add4f0e0ff74230e


纠错反馈