我也来扔一个Promise吧……

287 阅读1分钟
function res(pre) {
    let resFn, rejFn, fns = this.fns;
    while (!resFn && fns.length > 0) {
        [resFn, rejFn] = fns.shift();
    }
    if (resFn && pre && pre.status === "pending") {
        return pre.then((ret) => exec.call(this, resFn, ret), (ret) => rej.call(this, rejFn, ret));
    }
    resFn ? exec.call(this, resFn, pre) : this.status = "resolved";
}


function rej(pre,fn) {
    while (!fn && fns.length > 0) {
        fn = fns.shift()[1];
    }
    fn ? exec.call(this, fn, pre) : this.status = "rejected";
}

function exec(fn, pre) {
    this.value = pre;
    try {
        res.call(this, fn(pre));
    } catch (e) {
        rej.call(this, e);
    }
}


function Promise(fn) {
    this.status = "pending";
    this.fns=[];
    setTimeout(() => fn((ret) => res.call(this, ret), (ret) => rej.call(this, ret)));
    return this;
}
Promise.prototype.then=function (resFn, rejFn) {
    let status = this.status;
    if (status !== "pending") {
        exec.call(this, status === "resolved" ? resFn : rejFn, this.value);
    } else {
        this.fns.push([resFn,rejFn]);
    }
    return this;
};
Promise.prototype.catch=function(fn){
    this.then(undefined,fn);
};

其它的api给留给大佬了……