node源码实现——简单的promise实现

promise是什么

顾名思义,promise就是一个承诺。承诺需要一段时间后兑现。在node中,这段时间就是异步操作执行到调用回调函数的时间。所以,promise的操作和异步操作有关。

promise的状态

  • Pending Promise对象实例创建时候的初始状态
  • Fulfilled 可以理解为成功的状态
  • Rejected 可以理解为失败的状态

    promise的简单应用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //定义一个Promise实例,实例会立即执行传参。传参接收2个参数
    //resolve参数是一个函数,用以改变promise的状态以及执行成功状态的回调函数
    //reject参数是一个函数,用以改变promise的状态以及执行失败状态的回调函数
    var promise=new Promise((resolve,reject)=>{
    setTimeout(()=>{
    if (Math.random>0.5) resolve('success');
    else reject('fail');
    },1000)
    })
    //promise的实例的then方法接收两个函数参数,是对resolve与reject函数的定义
    promise.then(fullfiled,rejected)

源码实现思路

  1. 由于要实例化,所以Promise首先是一个类。constructor上有一个记录状态的变量。并且在实例化的过程中会立即执行传参。
  2. 原型上有一个then方法,接受两个参数,分别是成功与失败状态要调用的函数。但是由于这两个函数都有传参,所以还需要包装一下。
  3. 在contructor中定义resolve与reject函数,这两个函数接收传参,执行时会改变实例状态,并把传参赋给then上定义的方法并执行他。
  4. 在constructor中执行Promise中传入的函数,将包装好的resolve与reject传入。

源码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//1.定义Promise类
class Promise {
//2.接收一个函数为参数
constructor (fn) {
//3.保存状态,默认为'unfulfilled'
this._status='unfulfilled';
//5.包装好resolve
let resolve=(data)=>{
//改变状态
this._status='fulfilled';
this._resolve(data);
}
//6.包装好reject
let reject=(err)=>{
//改变状态
this._status='failed';
this._reject(err);
}
//7.立即执行
fn(resolve,reject);
}
//4.Promise.prototype上定义then方法,将传递的函数保存为内部方法
then (resolve,reject) {
this._resolve=resolve;
this._reject=reject;
}
}