likes
comments
collection
share

简易Promise实现:从零开始构建JavaScript异步神器

作者站长头像
站长
· 阅读数 10

1. 什么是Promise?

Promise 是 JavaScript 中一种异步编程的解决方案,它可以让我们用更优雅、简洁的方式来处理异步操作。通过使用Promise,我们可以避免回调地狱现象,提高代码的可读性和维护性。

2. Promise的基本使用方法

Promise 有三种状态:pending、fulfilled 和 rejected。当Promise实例化时,默认为pending状态。当异步操作成功时,转为fulfilled状态;当异步操作失败时,转为rejected状态。Promise对象提供了then和catch方法,分别处理成功和失败的情况。

以下是Promise的一个简单例子:

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success');
  }, 500);
});

promise.then(value => {
  console.log(value);
}).catch(error => {
  console.log(error);
});

接下来,我们将手把手实现一个简易版Promise。

3. 实现一个简易版Promise

3.1 结构定义

首先,我们定义一个MyPromise类,并在类中定义三个状态常量。

class MyPromise {
  static PENDING = 'pending';
  static FULFILLED = 'fulfilled';
  static REJECTED = 'rejected';
	
  constructor(executor) {
    // ...待实现
  }
}

然后,我们在类的构造函数中定义状态,并定义成功和失败的结果。

class MyPromise {
  // ...前面的代码

  constructor(executor) {
    this.status = MyPromise.PENDING;
    this.value = null;
    this.reason = null;
  }
}

3.2 执行器

接下来,我们需要实现一个执行器函数,它接受两个参数:resolve和reject,用于改变Promise的状态。

在构造函数中,我们传入这两个参数,并进行异常捕获。

class MyPromise {
  // ...前面的代码

  constructor(executor) {
    // ...前面的代码
    try {
      executor(this._resolve.bind(this), this._reject.bind(this));
    } catch (error) {
      this._reject(error);
    }
  }

  _resolve(value) {
    if (this.status === MyPromise.PENDING) {
      this.status = MyPromise.FULFILLED;
      this.value = value;
    }
  }

  _reject(reason) {
    if (this.status === MyPromise.PENDING) {
      this.status = MyPromise.REJECTED;
      this.reason = reason;
    }
  }
}

3.3 then方法

接下来,我们实现Promise的核心函数:then方法。该方法接受两个参数,分别用于处理成功和失败的情况。

我们在MyPromise类中定义then方法:

class MyPromise {
  // ...前面的代码

  then(onFulfilled, onRejected) {
    if (this.status === MyPromise.FULFILLED) {
      onFulfilled(this.value);
    }
    
    if (this.status === MyPromise.REJECTED) {
      onRejected(this.reason);
    }
  }
}

3.4 catch方法

我们还需要实现catch方法,用于捕捉错误。catch方法本质上也是调用then方法。

class MyPromise {
  // ...前面的代码

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

至此,我们已经实现了一个简易版的Promise。

4. 测试简易版Promise的功能

为了测试我们实现的简易版Promise是否可用,我们可以创建一些测试用例:

const myPromise = new MyPromise((resolve, reject) => {
  setTimeout(() => {
    resolve('success');
  }, 500);
});

myPromise.then(value => {
  console.log(value);
}).catch(error => {
  console.log(error);
});

运行上面的代码,将在500毫秒后输出"success"。

5. 总结

本文手把手地实现了一个简易版Promise,通过这个过程,帮助我们更好地理解Promise的原理和实现。需要注意的是,本文实现的简易版Promise并不完善,有很多细节没有处理,例如链式调用等。