📜  什么是 js 承诺 - Javascript (1)

📅  最后修改于: 2023-12-03 15:21:46.466000             🧑  作者: Mango

什么是 JavaScript 承诺(Promise)?

JavaScript 承诺是一种处理异步操作的方法。承诺包装一个异步操作并返回一个代表该异步操作结果的对象。承诺从产生到解决的整个过程分为三种状态:未完成(pending)、已完成(fulfilled)和已拒绝(rejected)。当承诺的状态从未完成变为已完成或已拒绝时,它就变得“已定型”,并且无法再更改状态。

特征
  • 异步操作的结果可以通过一个对象访问。
  • 承诺状态不可改变。
  • 承诺对象可以被链式地链接,以按照特定的执行顺序执行多个异步调用。
图示

下图展示了一个典型的 JavaScript 承诺生命周期的示例。

          Promise
_____________|______________
|            |             |
pending     fulfilled    rejected
|                           |
then()                    catch()
|                           |
v                           v
Chain Promise  Chain Promise
  • Promise 处于“pending”状态,异步操作尚未完成。
  • 异步操作最终成功,则 Promise 的状态为“fulfilled”。
  • 异步操作最终失败,则 Promise 的状态为“rejected”。
  • 承诺可以使用 then() 方法来附加成功或失败后的回调函数。
  • 如果 Promise 被拒绝,可以使用 catch() 方法来附加失败后的回调函数。
优点
  • 可以轻松处理异步操作。
  • 可以使代码更模块化,更易于维护。
  • 可以更好地处理错误。
缺点
  • 读起来有一些复杂。
  • 容易陷入回调地狱。
使用

使用 Promise 非常简单,只需创建一个 Promise 并附加回调,如下所示:

const promise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    // 成功
    resolve("Data fetched successfully.");
    // 失败
    // reject("Error fetching data.");
  }, 2000);
});

// 附加回调
promise.then(data => {
  console.log(data);
}).catch(error => {
  console.log(error);
});
  • 创建一个新的 Promise 对象,并在其构造函数中传入一个函数,该函数将一个 resolve 回调函数和一个 reject 回调函数作为参数。
  • 在异步操作完成后,调用 resolve 函数或 reject 函数。
  • 附加一个或多个回调函数,通过 then() 方法或 catch() 方法附加回调函数。
结论

JavaScript 承诺提供了一种更优雅、更简单的方式来处理异步操作。虽然它可能需要一些时间适应其基本概念和用法,但它可以大大提高代码的可扩展性和可重用性,从而更轻松地处理异步代码。