JavaScript 中的 Promise,变化与优化

JavaScript中的Promise是一种用于处理异步操作的对象。Promise有三种状态:未完成/进行中(pending)、已成功(fulfilled)和已失败(rejected)。它可以链式调用,可以让我们更为清晰、简洁地处理异步回调函数,避免了深度嵌套和回调地狱。

Promise有两个重要的方法:Promise.prototype.then和Promise.prototype.catch。then方法用于成功时的回调函数,catch方法用于失败时的回调函数。

Promise还有一个重要的特点:一旦状态改变,就不会再次改变。比如,如果状态从pending变为fulfilled,再调用一次then方法也会执行成功回调函数。Promise还可以使用Promise.all方法来一次性处理多个Promise对象,只有所有Promise对象都成功或者存在一个Promise对象失败才视为成功或失败。

下面是Promise的一些应用场景:

1. 异步操作:Promise最常见的应用就是处理异步操作,避免了使用回调函数带来的回调地狱,使代码更简洁、可读性更高。

2. 处理网络请求:在使用Ajax进行网络请求时,可以使用Promise处理回应数据。

3. 处理浏览器事件:可以使用Promise处理浏览器事件的异步回调。

4. 处理定时器:可以使用Promise处理定时器。

总的来说,Promise解决了异步回调函数严重的可读性和可维护性问题,提高了代码的可读性和可维护性,是一种非常有用的异步处理方式。


代码演示:

class MyPromise {
  constructor(fn) {
    this._state = 'pending';
    this._value = undefined;
    this._callbacks = [];

    try {
      fn(this._resolve.bind(this), this._reject.bind(this));
    } catch (error) {
      this._reject(error);
    }
  }

  _resolve(value) {
    if (this._state !== 'pending') {
      return;
    }

    this._state = 'fulfilled';
    this._value = value;

    for (const callback of this._callbacks) {
      callback.onFulfilled(value);
    }

    this._callbacks = [];
  }

  _reject(reason) {
    if (this._state !== 'pending') {
      return;
    }

    this._state = 'rejected';
    this._value = reason;

    for (const callback of this._callbacks) {
      callback.onRejected(reason);
    }

    this._callbacks = [];
  }

  then(onFulfilled, onRejected) {
    return new MyPromise((resolve, reject) => {
      const callback = { onFulfilled, onRejected, resolve, reject };

      if (this._state === 'pending') {
        this._callbacks.push(callback);
      } else if (this._state === 'fulfilled') {
        setTimeout(() => {
          this._handle(callback);
        }, 0);
      } else if (this._state === 'rejected') {
        setTimeout(() => {
          this._handle(callback);
        }, 0);
      }
    });
  }

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

  _handle(callback) {
    try {
      if (this._state === 'fulfilled') {
        const value = callback.onFulfilled(this._value);
        callback.resolve(value);
      } else if (this._state === 'rejected') {
        const value = callback.onRejected(this._value);
        callback.reject(value);
      }
    } catch (error) {
      callback.reject(error);
    }
  }
}

这个实现基本上符合 Promise/A+ 规范,并且也考虑了一些细节问题,比如在 Promise 已经完成时,通过 setTimeout 来异步执行回调函数,以及在执行 then 方法时,返回一个新的 Promise,从而支持链式调用。

在实际的开发中,我们通常会使用 JavaScript 内置的 Promise 对象,而不是手动实现一个 Promise。当然,在了解 Promise 的原理和规范的基础上,手动实现一个 Promise 也是非常有意义的,它可以帮助我们更好地理解 JavaScript 异步编程的本质。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeekyGuru

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值