Promise.all、Promise.race、Promise.allSettled、Promise.any区别

目录

1.Promise.all

2.Promise.race

3.Promise.allSettled

4.Promise.any


1.Promise.all

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

const p = Promise.all([p1, p2, p3]);

p的状态由p1,p2,p3 决定,分成两种情况。

(1)只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

{

    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p1--all---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p2--all---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            //resolve("p3--all---执行了")
            reject()
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    Promise.all([p1, p2, p3]).then((res) => {
        console.log("%cPromise.all执行成功了", "color: green;font-size:22px", res)
    })
    .catch((error) => {
    console.log("%cPromise.all执行失败了", "color: red;font-size:22px",error)
    })

}

或者 

{
    let p1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p1---执行了")
            }, 1000);
        })
    }
    let p2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p2---执行了")
            }, 1000);
        })
    }
    let p3 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                //resolve("p3---执行了")
                reject("p3---执行失败了")
            }, 1000);
        })

    }

    Promise.all([p1(), p2(), p3()]).then((res) => {
        console.log("%cPromise.all执行成功了", "color: green;font-size:16px", res)
    })
    .catch((error) => {
        console.log("%cPromise.all执行失败了", "color: red;font-size:16px",error)
    })

}

 

2.Promise.race

 Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

const p = Promise.race([p1, p2, p3]);

上面代码中,只要p1p2p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

{

    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p1--race---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p2--race---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            //resolve("p3--race---执行了")
            reject()
        }, 1000);
    }).then((res) => {
        console.log(res);
    })

    Promise.race([p1, p2, p3]).then((res) => {
        console.log("%cPromise.race执行成功了", "color: green;font-size:22px", res)
    })
    .catch((error) => {
            console.log("%cPromise.race执行失败了", "color: red;font-size:16px",error)
     })


}

或者

{
    let p1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p1---执行了")
            }, 10000);
        })
    }
    let p2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p2---执行了")
            }, 10000);
        })
    }
    let p3 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                //resolve("p3---执行了")
                reject()
            }, 5000);
        })

    }

    Promise.race([p1(), p2(), p3()]).then((res) => {
        console.log("%cPromise.race执行成功了", "color: green;font-size:16px", res)
    })
    .catch((error) => {
        console.log("%cPromise.race执行失败了", "color: red;font-size:16px",error)
    })

}

3.Promise.allSettled

Promise.allSettled() 方法返回一个在所有给定的 promise 都已经 fulfilled 或 rejected 后的 promise ,并带有一个对象数组,每个对象表示对应的 promise 结果。  

const p = Promise.allSettled([p1, p2, p3]); 
{

    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p1--allSettled---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p2--allSettled---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            //resolve("p3--allSettled---执行了")
            reject()
        }, 1000);
    }).then((res) => {
        console.log(res);
    })

    Promise.allSettled([p1, p2, p3]).then((res) => {
        console.log("%cPromise.allSettled执行成功了", "color: green;font-size:22px", res)
    })
        .catch((error) => {
            console.log("%cPromise.allSettled执行失败了","color: red;font-size:16px", error)
        })
}

或者

{
    let p1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p1---执行了")
            }, 10000);
        })
    }
    let p2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p2---执行了")
            }, 1000);
        })
    }
    let p3 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                //resolve("p3---执行了")
                reject("p3---失败了")
            }, 6000);
        })
    }

    Promise.allSettled([p1(), p2(), p3()]).then((res) => {
        console.log("%cPromise.allSettled执行成功了", "color: green;font-size:16px", res)
    })
    .catch((error) => {
        console.log("%cPromise.allSettled执行失败了","color: red;font-size:16px", error)
    })

}

4.Promise.any

只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。  

Promise.any()Promise.race()方法很像,只有一点不同,就是Promise.any()不会因为某个 Promise 变成rejected状态而结束,必须等到所有参数 Promise 变成rejected状态才会结束。  

const p = Promise.any([p1, p2, p3]);  
{

    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p1--any---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p2--any---执行了")
        }, 1000);
    }).then((res) => {
        console.log(res);
    })
    let p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            //resolve("p3--any---执行了")
            reject()
        }, 1000);
    }).then((res) => {
        console.log(res);
    })


    Promise.any([p1, p2, p3]).then((res) => {
        console.log("%cPromise.any执行成功了", "color: green;font-size:22px", res)
    })
        .catch((error) => {
            console.log("%cPromise.any执行失败了","color: red;font-size:16px", error)
        })

}

或者

{
    let p1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p1---执行了")
            }, 10000);
        })
    }
    let p2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("p2---执行了")
            }, 6000);
        })
    }
    let p3 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                //resolve("p3---执行了")
                reject()
            }, 1000);
        })
    }

    Promise.any([p1(), p2(), p3()]).then((res) => {
        console.log("%cPromise.any执行成功了", "color: green;font-size:16px", res)
    })
    .catch((error) => {
            console.log("%cPromise.any执行失败了","color: red;font-size:16px", error)
    })

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Promise.all和Promise.allSettled是两种不同的Promise方法,它们在使用场景和返回结果上有所不同。 1. Promise.all: - 使用场景:当需要等待多个Promise对象都完成后再执行后续操作时,可以使用Promise.all。 - 返回结果:返回一个新的Promise对象,Promise对象在所有给定的Promise对象都已经fulfilled后才会fulfilled,如果其中任何一个Promise对象被rejected,则返回的Promise对象会立即被rejected。 - 示例代码: ```javascript const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = Promise.resolve(3); Promise.all([promise1, promise2, promise3]) .then(values => { console.log(values); // 输出:[1, 2, 3] }) .catch(error => { console.log(error); // 如果有任何一个Promise对象被rejected,则会执行这里的代码 }); ``` 2. Promise.allSettled: - 使用场景:当需要等待多个Promise对象都完成后,无论是fulfilled还是rejected,都需要获取每个Promise对象的结果时,可以使用Promise.allSettled。 - 返回结果:返回一个新的Promise对象,该Promise对象在所有给定的Promise对象都已经fulfilled或rejected后才会fulfilled,返回的Promise对象带有一个对象数组,每个对象表示对应的Promise对象的结果,包括状态(fulfilled或rejected)和值。 - 示例代码: ```javascript const apiOne = function(id) { return new Promise((resolve, reject) => { resolve({ result: true, text: 1 }); }); }; const apiTwo = function(id) { return new Promise((resolve, reject) => { reject({ result: true, text: 2 }); }); }; Promise.allSettled([apiOne('one'), apiTwo('two')]) .then(results => { console.log(results); /* 输出: [ { status: 'fulfilled', value: { result: true, text: 1 } }, { status: 'rejected', reason: { result: true, text: 2 } } ] */ }) .catch(error => { console.log(error); }); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

volodyan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值