手写Promise常用方法

1.Promise.Race()


/**
 * 手写Promise.race方法
 * 1.返回promise对象
 * 2.for循环创建变量i,只要promise决议,则i++
 * @param {Promise<string>[]} promiseList 
 */
Promise._race = function(promiseList = []) {
    return new Promise((resolve, reject) => {
        let i = 0;
        for (var p of promiseList) {
            p.then(res => {
                if (i < 1) {
                    
                    i ++;
                }
            }).catch(err => {
                if(i < 1) {
                    reject(err)
                    i ++;
                }
            })
        }
    })
    
}

// 测试 src/promise/11_promise_race.write.js
var p1 = new Promise((rsv,tjc) => {
    setTimeout(rsv, Math.random() * 200, 'p1');
})
var p2 = new Promise((rsv,tjc) => {
    setTimeout(tjc, Math.random() * 200, 'p2');
})
var p3 = new Promise((rsv,tjc) => {
    setTimeout(tjc, Math.random() * 200, 'p3');
})
var p4 = new Promise((rsv,tjc) => {
    setTimeout(rsv, Math.random() * 200, 'p4');
})

Promise._race([p1,p2,p3,p4]).then(res => {
    console.log('res=',res)
}).catch(err => {
    console.log('err=',err)
}).finally(f => {
    console.log('finally')
})

2.Promise.any()

/**
 * 手写promise.any()
 * 只要有一个resolve,就返回结果;如果全部都是reject,则返回错误
 * - 1.返回promise对象
 * - 2.迭代,声明变量i,j
 *      - a.发现resolve,执行i++, j++
 *      - b.发现reject,执行i++
 *      - c.j<1时,promise状态改为``fullfilled
 *      - d.i=promiseList.length -1,触发reject
 * @param {Promise<string>[]} promiseList 
 */
Promise._any = function(promiseList){
    let i = 0, j = 0;
    return new Promise((resolve,reject) => {
        for(var p of promiseList){
            p.then(res => {
                if (j <1){
                    resolve(res);
                }
                i ++;
                j ++;
            }).catch(err => {
                if (i >= promiseList.length -1){
                    reject('AggregateError: No Promise in Promise.any was resolved')
                }
                i ++;
            })
        }
    })
}


// 测试 node src/promise/12_promise.any.write.js 
var p1 = new Promise((rsv,rjc) => {
    setTimeout(rjc, Math.random() * 200, 'p1');
})
var p2 = new Promise((rsv,rjc) => {
    setTimeout(rjc, Math.random() * 200, 'p2');
})
var p3 = new Promise((rsv,rjc) => {
    setTimeout(rjc, Math.random() * 200, 'p3');
})
var p4 = new Promise((rsv,rjc) => {
    setTimeout(rjc, Math.random() * 200, 'p4');
})

Promise._any([p1,p2,p3,p4]).then(res => {
    console.log('res=',res)
}).catch(err => {
    console.log('err=',err)
})

3.Promise.all()

/**
 * 手写Promise.all()
 * - 返回promise
 * - 1.声明变量ret,i,j
 * - 2.迭代
 *      - a.thennable, 决议结果填入到ret中,i++,如果所有promise全部决议完成,执行resolve
 *      - b.reject, 返回第一个拒绝的promise结果
 * @param {Promise<string>[]} promiseList 
 */
Promise._all = function(promiseList){
    return new Promise((resolve, reject) => {
        var ret = [], i = 0, j = 0;
        ret.length = promiseList.length;
        for(let index in promiseList){
            promiseList[index].then(res => {
                ret[index] = res;
                i ++;
                if (i === promiseList.length)(
                    resolve(ret)
                )
            }).catch(err => {
                if (j < 1) {
                    reject(err)
                }
                j ++;
                
            })
        }
    })
}



// 测试 node src/promise/12_promise.any.write.js 
var p1 = new Promise((rsv,rjc) => {
    setTimeout(rsv, Math.random() * 200, 'p1');
})
var p2 = new Promise((rsv,rjc) => {
    setTimeout(rsv, Math.random() * 200, 'p2');
})
var p3 = new Promise((rsv,rjc) => {
    setTimeout(rsv, Math.random() * 200, 'p3');
})
var p4 = new Promise((rsv,rjc) => {
    setTimeout(rsv, Math.random() * 200, 'p4');
})

Promise._all([p1,p2,p3,p4]).then(res => {
    console.log('res=',res)
}).catch(err => {
    console.log('err=',err)
})

4.romise.allSettled()

/**
 * 手写Promise.allSettled()
 * - 返回promise对象
 * - 1.声明变量ret, 计数器count
 * - 2.迭代
 *      - a.thenable, 填入ret
 *      - b.rejected, 填入rest
 *      - c.达到最后一个promise,完成则resolve,拒绝则reject
 * @param {Promise<string>[]} promiseList 
 */
Promise._allSettled = function(promiseList){
    return new Promise((resolve, reject) => {
        var ret = [], count = 0;
        ret.length = promiseList.length;
        for(let i in promiseList){
            promiseList[i].then(res => {
                ret[i] = { status: 'fulfilled', value: res };
                count ++;
                if (count === promiseList.length){
                    resolve(ret);
                }
            }).catch(err =>{
                ret[i] = { status: 'rejected', value: err };
                count ++;
                if (count === promiseList.length){
                    reject(ret);
                }
            })
        }
    })
}

// 测试 node src/promise/12_promise.any.write.js 
var p1 = new Promise((rsv,rjc) => {
    setTimeout(rsv, Math.random() * 200, 'p1');
})
var p2 = new Promise((rsv,rjc) => {
    setTimeout(rsv, Math.random() * 200, 'p2');
})
var p3 = new Promise((rsv,rjc) => {
    setTimeout(rjc, Math.random() * 200, 'p3');
})
var p4 = new Promise((rsv,rjc) => {
    setTimeout(rjc, Math.random() * 200, 'p4');
})

Promise._allSettled([p1,p2,p3,p4]).then(res => {
    console.log('res=',res)
}).catch(err => {
    console.log('err=',err)
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Promise方法是指通过自己编代码实现Promise类的相关方法,比如Promise.all和Promise.any。在引用和引用中,作者给出了Promise.all和Promise.any的具体实现代码。 对于Promise.all方法实现,可以使用一个累加器count来判断是否所有的promise都已经成功,并将成功的结果存放在结果数组result中。当累加器count等于传入的promise数组长度时,表示所有的promise都已经成功,可以通过resolve来返回最终的成功结果。如果其中有一个promise失败,则直接通过reject返回失败结果。这里使用了Promise.resolve方法将传入的参数转化为promise对象,以便统一处理。具体的实现代码可以参考引用中的myAll方法。 对于Promise.any方法实现,同样可以使用一个累加器count来判断是否已经找到了成功的promise,并将成功的结果通过resolve返回。如果遍历完所有的promise都没有找到成功的,则通过reject返回失败结果。具体的实现代码可以参考引用中的myAny方法。 需要注意的是,上述的实现代码可能只是简单的示例,并不一定适用于所有情况,实际的实现可能还需要考虑更多的细节和边界条件。另外,Promise方法主要是为了更好地理解Promise的工作原理和实现方式,实际开发中通常会直接使用JavaScript中内置的Promise对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [promise方法(all、race、allSettled、any、finally),你会几个](https://blog.csdn.net/weixin_45774485/article/details/122462081)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[email protected]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值