返回

Promise:你的开发 利器

前端

在当今快速发展的技术世界中,异步编程变得越来越普遍。异步编程允许我们执行需要等待完成的操作,而无需阻塞主线程。这使得应用程序更加响应且易于使用。

JavaScript 中使用最广泛的异步编程模型之一是 Promise。Promise 对象表示异步操作的最终完成或失败。它允许我们以更结构化和可读的方式处理异步操作。

Promise 的优势

Promise 提供了许多优势,包括:

  • 可读性: Promise 使异步代码更易于阅读和理解。
  • 可维护性: Promise 使得维护异步代码更加容易,因为我们不必再担心回调地狱。
  • 可测试性: Promise 使得测试异步代码更加容易,因为我们可以使用 Promise.resolve() 和 Promise.reject() 来模拟异步操作的结果。

手写实现一个简单的 Promise

为了更好地理解 Promise 的工作原理,我们不妨自己手写一个简单的 Promise。下面是实现代码:

class Promise {
  constructor(executor) {
    this.state = 'pending';
    this.value = undefined;
    this.reason = undefined;
    this.onFulfilledCallbacks = [];
    this.onRejectedCallbacks = [];

    const resolve = (value) => {
      if (this.state === 'pending') {
        this.state = 'fulfilled';
        this.value = value;
        this.onFulfilledCallbacks.forEach((callback) => callback(value));
      }
    };

    const reject = (reason) => {
      if (this.state === 'pending') {
        this.state = 'rejected';
        this.reason = reason;
        this.onRejectedCallbacks.forEach((callback) => callback(reason));
      }
    };

    executor(resolve, reject);
  }

  then(onFulfilled, onRejected) {
    return new Promise((resolve, reject) => {
      if (this.state === 'fulfilled') {
        onFulfilled(this.value);
        resolve(this.value);
      } else if (this.state === 'rejected') {
        onRejected(this.reason);
        reject(this.reason);
      } else {
        this.onFulfilledCallbacks.push(() => {
          onFulfilled(this.value);
          resolve(this.value);
        });
        this.onRejectedCallbacks.push(() => {
          onRejected(this.reason);
          reject(this.reason);
        });
      }
    });
  }

  catch(onRejected) {
    return this.then(undefined, onRejected);
  }

  finally(onFinally) {
    return this.then(
      (value) => {
        onFinally();
        return value;
      },
      (reason) => {
        onFinally();
        throw reason;
      }
    );
  }
}

Promise 的 API

Promise 提供了许多有用的 API,包括:

  • Promise.resolve(): 创建一个新的 Promise 对象,并立即将其状态设置为已完成,其结果为给定的值。
  • Promise.reject(): 创建一个新的 Promise 对象,并立即将其状态设置为已拒绝,其结果为给定的原因。
  • Promise.all(): 接受一个 Promise 对象的数组作为参数,并返回一个新的 Promise 对象。当所有传入的 Promise 对象都已完成时,此新 Promise 对象的状态将变为已完成,其结果为一个包含所有传入 Promise 对象的结果的数组。
  • Promise.race(): 接受一个 Promise 对象的数组作为参数,并返回一个新的 Promise 对象。当第一个传入的 Promise 对象完成时,此新 Promise 对象的状态将变为已完成或已拒绝,其结果为第一个传入的 Promise 对象的结果。

结语

Promise 是一个强大的工具,可以帮助我们以更结构化和可读的方式处理异步操作。通过手写实现一个简单的 Promise,我们可以更好地理解 Promise 的工作原理。Promise 的 API 也非常有用,可以帮助我们轻松地处理各种异步操作。