自我实现promise

ps:代码是抄的,不知道抄的那位大哥的,介意,联系我删除哈
function Promise(fn) {
var data = undefined,
reason = undefined;
var succallbacks = [];
var failcallbacks = []; //失败队列
var status = “pending”; //状态等待
this.then = function(fulfilled, rejected) { //Promise的.then 传进两个参数,第一个是失败的队列,第二个成功返回的reject
return new Promise(function(resolve, reject) { //返回一个新的promise return一个新的prominse,可以进行.then的链式 返回的promise里面有新的fn
function suc(value) { //成功
var ret = typeof fulfilled === ‘function’ && fulfilled(value) || value;
if (ret && typeof ret[‘then’] == ‘function’) { //判断 then中的 返回的是否是promise对象,如果是注册then方法
ret.then(function(value) {
resolve(value);
});
} else {
resolve(ret);
}
}

                function errback(reason) { //失败
                    reason = typeof rejected === 'function' && rejected(reason) || reason;
                    reject(reason);
                }

                if (status === 'pending') {
                    succallbacks.push(suc);
                    failcallbacks.push(errback);
                } else if (status === 'fulfilled') {
                    suc(data);
                } else {
                    errback(reason);
                }
            })

        }

        function resolve(value) {
            setTimeout(function() { //加入延时
                status = "fulfilled";
                data = value;
                succallbacks.forEach((callback) => {
                    callback(value);
                })
            }, 0)

        }

        function reject(value) {
            setTimeout(function() {
                status = "rejected";
                reason = value;
                failcallbacks.forEach((callback) => {
                    callback(value);
                })

            }, 0)
        }

        fn(resolve, reject);
    }

    let p = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(1);
        }, 1000)
    });

    p.then(data => {
        console.log(data);
        return new Promise((resolve, reject) => { //then 方法返回的是一个promise对象,故执行 promise中的then注册该结果,在resolve
            setTimeout(() => {
                resolve(2);
            }, 1000)
        })
    }).then(data => {
        console.log(data);
    })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值