Promise.all和Promise.race的区别和使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise.all和Promise.race的区别和使用相关的知识,希望对你有一定的参考价值。
参考技术A 1. Promise.allPromise.all可以将多个实例组装成一个新的实例,成功的时候返回一个成功数组,失败的时候则返回最先被reject失败状态的值
比如当一个页面需要在很多个模块的数据都返回回来时才正常显示,否则loading
比如当数组里的P1,P2都执行完成时,页面才显示。
值得注意的是,返回的数组结果顺序不会改变,即使P2的返回要比P1的返回快,顺序依然是P1,P2
2. Promise.race
race是赛跑的意思,也就是说Promise.race([p1, p2, p3])里面的结果哪个获取的快,就返回哪个结果,不管结果本身是成功还是失败
一般用于和定时器绑定,比如将一个请求和一个三秒的定时器包装成Promise实例,加入到race队列中,请求三秒中还没有回应时,给用户一些提示或一些相应的操作。
手写Promise.all和Promise.race
手写Promise.all和Promise.race
Promise.all
function promiseAll (promises) {
if (!Array.isArray(promises)) {
throw new Error ("promises must to be an array!!!");
}
return new Promise (function (resolve, reject) {
let promiseNum = promises.length;
let resolvedCount = 0;
let resolveValues = new Array(promiseNum);
try {
for (let i = 0; i < promiseNum; i++) {
promises[i].then(function (value) {
resolveValues[i] = value;
if (++resolvedCount === promiseNum) {
resolve(resolveValues);
}
})
} catch (error) {
reject(error);
}
})
}
Promise.race
function promiseRace(promise) {
if (!Array.isArray (promises)) {
throw new Error ("promises must be an array!!!");
}
let resolved = false;
return new Promise(function (resolve, reject) {
try{
promises.forEach(p =>
p.then(data => {
if (!resolved) {
resolved = true;
resolve (data);
}
})
)
} catch (error) {
reject(error);
}
})
}
以上是关于Promise.all和Promise.race的区别和使用的主要内容,如果未能解决你的问题,请参考以下文章
Promise.all和Promise.race区别,和使用场景
JavaScript的Promise.all和Promise.race
如何使用并区分Promise.all和Promise.race?
(转载)理解和使用Promise.all和Promise.race