js手写(简单实现)-Promise

80 阅读1分钟
三种状态 pending || resolved || rejected
当处于pending状态的时候,可以转移到resolved或者rejected状态
当处于resolved状态或者rejected状态的时候,就不可变

必须有一个then异步执行方法,then接收2个参数并且必须返回一个promise:

onResolved 用来接收promise成功的值
onRejected 用语接收promise失败的原因
promise.prototype.then = function(onResolved,onRejected){}
function myPromise(callback) {
//    维护状态
    this.status = 'pending'
//    存储回调函数
    this.successArray = [];
    this.failArray = [];
//    定义resolve、reject方法
    let resolve = (value) => {
        //    改变状态
        this.status = 'resolved';
        //    执行回调函数
        this.successArray.forEach(fn => value = fn(value))
        //    清空队列
        this.successArray = [];
        //    存储结果
        this.value = value;
    }
    let reject = (value) => {
        //    改变状态
        this.status = 'resolved';
        //    执行回调函数
        this.failArray.forEach(fn => value = fn(value))
        //    清空队列
        this.failArray = [];
        //    存储结果
        this.value = value;
    }
//    执行回调函数
    try {
        callback(resolve, reject);
    } catch (e) {
        reject(e);
    }
}

//原型方法
myPromise.prototype.then = function (success, fail) {
//    判断状态
    if (this.status === 'pending') {
        //    存储回调函数
        success && this.successArray.push(success);
        fail && this.failArray.push(fail);
    } else if (this.status === 'resolved') {
        //    立即执行
        success && success(this.value)
    } else {
        fail && fail(this.value);
    }
    return this;
}