在现实生活中,承诺是人与人之间的信任,表示一定会发生某事。在 JavaScript 中,Promise 是一种对象,用于在将来的某个时间点产生一个单一的值(在需要时)。Promise 用于管理和处理异步操作。

JavaScript Promise 的必要性

之前我们学习了使用事件和回调函数来处理数据。然而,这种方式的应用范围有限。原因是事件无法有效地管理和处理异步操作。因此,Promise 是一种更简单、更好的处理异步操作的方法。

Promise 和事件处理程序之间存在两个主要区别:

  1. Promise 永远不会多次失败或成功。它只能发生一次。
  2. Promise 无法从成功切换到失败,也无法从失败切换到成功。如果 Promise 已经成功或失败,然后稍后如果添加了任何成功/失败回调,正确的回调将被调用,无论之前发生了什么事件。

Promise 的术语

Promise 可以处于以下几种状态之一:

  1. 待定(pending): Promise 既未被拒绝也未被解决。
  2. 已解决(fulfilled): Promise 相关操作成功完成。
  3. 被拒绝(rejected): Promise 相关操作未能成功完成。
  4. 已完成(settled): 不管操作是被解决还是被拒绝,都被视为已完成。

因此,Promise 表示异步操作的完成情况及其结果。它可以是成功完成的 Promise,也可以是失败的 Promise,但最终会完成。Promise 使用 then() 方法,在 Promise 解析完成后执行。

Promise 的方法

Promise 的方法几乎适用于所有主流网络浏览器(如 Chrome、Mozilla、Opera 等)。以下是一些常用的方法:

方法名概要
Promise.resolve(promise)如果 promise.constructor==Promise,则返回一个 Promise。
Promise.resolve(thenable)从具有 then 方法的对象创建一个新的 Promise。
Promise.resolve(obj)使用对象解析一个 Promise。
Promise.reject(obj)使用对象拒绝一个 Promise。
Promise.all(array)返回一个 Promise,当数组中的每个项目都完成时,它被解决;如果数组中的项目未完成,则被拒绝。
Promise.race(array)如果数组中的任何项目立即完成,它就解决 Promise;如果数组中的任何项目立即被拒绝,它就拒绝 Promise。

Promise 的构造函数

new Promise(function(resolve, reject){});这里,resolve(thenable) 表示 Promise 将通过 then() 解析。resolve(obj) 表示 Promise 将以对象完成。reject(obj) 表示 Promise 将以对象拒绝。

Promise 的实现示例

<!DOCTYPE html>
<html>
<head>
  <h2>JavaScript Promise</h2>
</head>
<body>
  <script>
    var p = new Promise(function(resolve, reject) {
      var x = 2 + 3;
      if (x == 5)
        resolve("已执行并成功解决");
      else
        reject("被拒绝");
    });

    p.then(function(fromResolve) {
      document.write("Promise 是 " + fromResolve);
    }).catch(function(fromReject) {
      document.write("Promise 是 " + fromReject);
    });
  </script>
</body>
</html>

在上面的 Promise 实现示例中,Promise 构造函数接受一个回调函数作为参数。该回调函数有两个参数:

  1. Resolve(解析): 当 Promise 成功执行时,调用 resolve 参数,提供结果。
  2. Reject(拒绝): 当 Promise 被拒绝时,调用 reject 参数,引发错误。

这意味着要么调用 resolve,要么调用 reject。在此示例中,then() 方法接受一个参数,该参数将在 Promise 解析时执行。否则,如果 Promise 被拒绝,将调用 catch() 方法处理拒绝状态。

使用 Promise 的优势

  1. 更好的处理异步操作的选择。
  2. 提供了更简便的错误处理和更清晰的代码可读性。

标签: js, JavaScript, JavaScript语言, JavaScript开发, JavaScript语法, JavaScript脚本, JavaScript教程, JavaScript入门, JavaScript入门教程, JavaScript进阶, JavaScript宝典, JavaScript学习, JavaScript指南, JavaScript大全