📜  JavaScript 承诺 MDN - Javascript (1)

📅  最后修改于: 2023-12-03 14:42:34.186000             🧑  作者: Mango

JavaScript Promise

JavaScript Promise 是 ECMAScript 6 中新增的一个异步编程解决方案,它为异步操作提供了更加合理、更加强大的处理方式。Promise 本身是一个对象,它代表了一个异步操作的最终完成或者是失败状态的结果。Promise 提供了一种便捷的方式来处理异步操作的结果,通过回调函数来管理异步操作,使得代码更加简洁。在此,我们将深入了解 JavaScript Promise 的用法以及它的优点。

创建 Promise 对象

我们可以通过 Promise 构造函数来创建 Promise 对象,Promise 构造函数接收一个函数作为参数,这个函数又接受两个参数,分别是 resolve 和 reject,分别用于处理 Promise 对象的成功和失败状态。

const promise = new Promise((resolve, reject) => {
  // 异步操作,成功时调用 resolve,失败时调用 reject
  // ...
});
Promise 状态

Promise 有三种状态:

  • pending:初始状态,既不是成功,也不是失败状态。
  • fulfilled:意味着操作成功完成。
  • rejected:意味着操作失败。

一个 Promise 对象的状态只能从 pending 转变为 fulfilled 或者是 rejected 状态,一旦这个状态被确定,它就不能再次变化。如果在 pending 状态的 Promise 对象上调用 resolve 或者是 reject 方法,这个状态就转变成了相应的状态。

Promise 方法

Promise 提供了一些常用的方法,我们也可以自己自定义一些方法来处理 Promise 对象。

then

Promise 对象提供了一个 then 方法,用来处理 Promise 对象的成功和失败状态。then 方法接收两个回调函数作为参数,分别处理 Promise 对象成功和失败时的结果。

promise.then(
  result => {
    // 成功时的处理
  },
  error => {
    // 失败时的处理
  }
);
catch

如果 Promise 对象在执行过程中发生错误,可以使用 catch 方法来处理 Promise 失败状态。catch 方法接收一个回调函数作为参数,用来处理 Promise 对象失败时的结果。

promise.catch(error => {
  // 失败时的处理
});
finally

有时候,我们需要在一个异步操作执行后,执行一些清理操作,例如关闭文件、释放资源等,这时我们可以使用 finally 方法。finally 方法接收一个回调函数作为参数,不管 Promise 对象成功和失败都会执行这个回调函数。

promise.finally(() => {
  // 清理操作
});
Promise.all

如果需要同时执行多个异步操作,并在所有异步操作都执行完成后获得它们的结果,就可以使用 Promise.all 方法。Promise.all 方法接收一个 Promise 对象数组作为参数,当所有的 Promise 对象全部执行后,会返回所有 Promise 对象执行结果的数组。

const promise1 = Promise.resolve('Hello');
const promise2 = new Promise(resolve => setTimeout(() => resolve('World'), 2000));
const promise3 = Promise.reject(new Error('Error!'));

Promise.all([promise1, promise2, promise3])
  .then(result => console.log(result))
  .catch(error => console.log(error.message)); // Error!

使用 Promise.all 方法还可以实现将多个异步操作串联起来执行,避免了回调地狱的问题。

Promise.race

如果需要同时执行多个异步操作,并在第一个完成后获得它的结果,可以使用 Promise.race 方法。Promise.race 方法接收一个 Promise 对象数组作为参数,当有一个 Promise 对象执行完成后,会返回这个 Promise 对象的执行结果。

const promise1 = new Promise(resolve => setTimeout(() => resolve('Hello'), 1000));
const promise2 = new Promise(resolve => setTimeout(() => resolve('World'), 2000));

Promise.race([promise1, promise2])
  .then(result => console.log(result)); // Hello
总结

JavaScript Promise 是一种有效的处理异步操作的方式,通过 Promise 对象的状态和一些常用的方法,可以更加简洁、优雅地处理异步操作。使用 Promise.all 和 Promise.race 方法可以将多个异步操作串联起来执行,降低代码的复杂性。因此,掌握 Promise 的用法是每个 JavaScript 程序员必须掌握的技能之一。