资讯专栏INFORMATION COLUMN

手写promise

red_bricks / 3318人阅读

摘要:缓存默认状态为此变量里放着此的结果存放的着所有成功的回调函数存放着所有的失败的回调函数调用此方法可以把变成成功态的时候你把挣到的钱传进来调用此方法可以把当前的变成失败态如果当前状态是初始态,则转成失败态立即执行传入的任务如果就是循环引用成功

function Promise(task) {
    let that = this;//缓存this
    //默认状态为pending
    that.status = "pending";
    //此变量里放着此promise的结果
    that.value = undefined;
    //存放的着所有成功的回调函数
    that.onResolvedCallbacks = [];
    //存放着所有的失败的回调函数
    that.onRejectedCallbacks = [];
    //调用此方法可以把promise变成成功态
    //resolve的时候你把挣到的钱传进来
    function resolve(value) {
        if(value instanceof Promise){
            return value.then(resolve,reject);
        }
        if (that.status == "pending") {
            that.status = "fulfilled";
            that.value = value;
            that.onResolvedCallbacks.forEach(item=>item(that.value));
        }
    }

    //调用此方法可以把当前的promise变成失败态
    function reject(reason) {
        //如果当前状态是初始态,则转成失败态
        if (that.status == "pending") {
            that.status = "rejected";
            that.value = reason;
            that.onRejectedCallbacks.forEach(item=>item(that.value));
        }
    }

    //立即执行传入的任务
    try {
        task(resolve, reject);
    } catch (e) {
        reject(e);
    }
}
function resolvePromise(promise2,x,resolve,reject){
    let then;
    //如果x就是promise2
    if(promise2 === x){
        return reject(new TypeError("循环引用"));
    }
    if(x instanceof Promise){
        if(x.status == "pending"){
            x.then(function(y){
                resolvePromise(promise2,y,resolve,reject);
            },reject);
        }else if(x.status == "fulfilled"){
            resolve(x.value);
        }else if(x.status == "rejected"){
            reject(x.value);
        }
    }else if(x!=null && (typeof x == "object" || typeof x == "function")){
        try{
            then = x.then;
            if(typeof then == "function"){
                then.call(x,function(y){
                    resolvePromise(promise2,y,resolve,reject)
                },reject);
            }
        }catch(e){
            reject(e);
        };
    }else{
        resolve(x);
    }
}
//onFulfilled成功的回调,onReject失败的回调
Promise.prototype.then = function (onFulfilled, onReject) {
    onFulfilled = typeof onFulfilled == "function"?onFulfilled:function(value){return value};
    onReject = typeof onReject=="function"?onReject:function(reason){
        throw reason;
    }
    let that = this;
    let promise2;
    if(that.status == "fulfilled"){
        promise2 = new Promise(function(resolve,reject){
            let x = onFulfilled(that.value);
            resolvePromise(promise2,x,resolve,reject);
        });
    }
    if(that.status == "rejected"){
        promise2 = new Promise(function(resolve,reject){
            let x = onReject(that.value);
            resolvePromise(promise2,x,resolve,reject);
        });

    }
    if(that.status == "pending"){
        promise2 = new Promise(function(resolve,reject){
            that.onResolvedCallbacks.push(function(){
                let x = onFulfilled(that.value);
                resolvePromise(promise2,x,resolve,reject);
            });
            that.onRejectedCallbacks.push(function(){
                let x = onReject(that.value);
                resolvePromise(promise2,x,resolve,reject);
            });
        });
    }
    return promise2;
}

Promise.all = function (arr) {
    return new Promise((resolve,reject) =>{
        let values = []
        let len = arr.length
        for(var i = 0;i < len; i++){
            let promise = arr[i]
            if(typeof promise.then == "function"){
                promise.then(res=>{
                    values.push(res)
                    if(values.length == len){
                        resolve(values)
                    }
                })
            }
        }
    })
}

Promise.race = function (arr) {
    return new Promise((resolve,reject) =>{
        let len = arr.length
        for(var i = 0;i < len; i++){
            let promise = arr[i]
            if(typeof promise.then == "function"){
                promise.then(res=>{
                    resolve(res)
                })
            }
        }
    })
}

Promise.resolve = function (value) {
    if (value instanceof Promise) return value
    return new Promise(resolve => resolve(value))
}

Promise.reject = function (value) {
    return new Promise((resolve,reject)=>reject(value))
}


module.exports = Promise;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92418.html

相关文章

  • 手写一款符合Promise/A+规范的Promise

    摘要:手写一款符合规范的长篇预警有点长,可以选择性观看。初始状态是,状态可以有或者不能从转换为或者从转换成即只要由状态转换为其他状态后,状态就不可变更。 手写一款符合Promise/A+规范的Promise 长篇预警!有点长,可以选择性观看。如果对Promise源码不是很清楚,还是推荐从头看,相信你认真从头看到尾,并且去实际操作了,肯定会有收获的。主要是代码部分有点多,不过好多都是重复的,不...

    rubyshen 评论0 收藏0
  • 【js】what is Promise手写实现简易版Promise

    摘要:有三种状态,等待中,已完成,已失败。对象状态不受外界影响,只有异步操作的结果可以改变状态,这就是的由来怎么用接受一个函数作为参数,这个参数函数的两个参数分别是和,用来执行了两种状态的回调函数。当实例生成后,用方法来指定两种状态的回调函数。 什么是Promise 官方的解释:Promise是一个用来传递异步操作消息的对象。Promise有三种状态,pending(等待中),resolve...

    LMou 评论0 收藏0
  • 手写极简版Promise

    摘要:极简版满足的使用方式生成实例对象的方式通过类直接调用静态方法,目前静态方法仅支持亲测使用,欢迎指教,互相学习,链接,欢迎。附赠利用构造函数手写的方法,链接。 极简版Promise 满足的使用方式 生成实例对象的方式:new MyPromise() 通过类直接调用静态方法:MyPromise.resolve(),目前静态方法仅支持resolve & reject 亲测使用OK,欢...

    geekidentity 评论0 收藏0
  • 手写实现promise

    摘要:简易版本的第一步列出三大块第二步负责注册所有的函数负责执行所有的函数第三步在里面要加上防止还没进行注册就直接执行了第四步里面要返回这样就可以链式调用了第五步三个状态的管理的链式调用在里面一个这样才能里面加上异步函数加上了加入状态为了解决在异 // 简易版本的promise // 第一步: 列出三大块 this.then resolve/reject fn(resolv...

    _ang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<