Promise拓展方法

AI5天前发布 beixibaobao
7 0 0

Promise拓展

这次介绍一些Promise的拓展方法。


Promise.reject()和Promise.resolve()

Promise.reject() 方法会返回一个一个 “已拒绝”(rejected)的 Promise 对象,参数为 拒绝原因 。

    let p = Promise.reject("Mission one fail");
    p.catch( err => {
        console.log(err);
    })

Promise.resolve() 方法返回一个 “解决”(resolve) 的 Promise 对象。

    let p = Promise.resolve("Mission success");
    p.then( data => {
        console.log(data);
    })

大白话:

  • Promise.resolve()就是直接返回成功
  • Promise。reject()就是直接返回失败

接下来我们马上就会用到。。。


Promise.all()

Promise.all() 静态方法接受一个 Promise 可迭代对象作为输入,并返回一个 Promise。当所有输入的 Promise 都被兑现时,返回的 Promise 也将被兑现(即使传入的是一个空的可迭代对象),并返回一个包含所有兑现值的数组。如果输入的任何 Promise 被拒绝,则返回的 Promise 将被拒绝,并带有第一个被拒绝的原因。

  • 传入一个Promise的可迭代对象(如:数组)
  • 如果全部成功,返回一个 成功值 的数组
  • 只要有一个失败,就返回一个失败,并返回第一个失败的 原因
    let p1 = Promise.reject("Mission 1 failed");
    let p2 = Promise.resolve(123);
    let p3 = Promise.reject("Mission 3 failed");
    let p4 = Promise.resolve("Mission 4 successed!");
    //可以分别注释来看看效果
    Promise.all([p1, p2, p3, p4])  //有失败的Promise对象
    //Promise.all([p2, p4])  //全部成功
    .then(res => {
        console.log(res);
    })
    .catch(err => {
        console.log(err);
    });

Promise.allSettled()

Promise.allSettled() 静态方法将一个 Promise 可迭代对象作为输入,并返回一个单独的 Promise。当所有输入的 Promise 都已敲定时(包括传入空的可迭代对象时),返回的 Promise 将被兑现,并带有描述每个 Promise 结果的对象数组。

  • 参数传入一个可迭代对象(如:对象数组)
  • 不论成功与否,都不会停,直到所有Promise都结束后,返回一个包含各Promise执行结果的对象数组
    let p1 = Promise.reject("mission one fail");
    let p2 = Promise.resolve("mission one success");
    let p3 = Promise.reject("mission one fail");
    let p4 = Promise.resolve("mission one success");
    Promise.allSettled([p1,p2,p3,p4])
    .then((resList) => {
        console.log(resList);  //这里返回了一个对象数组,可以打开浏览器F12用控制台看看
        resList.forEach(item => {  //遍历,根据结果分别进行Promise返回值输出
            if(item.status === "fulfilled") console.log(item.value);
            else console.log(item.reason);
        })
    });

Promise.race

Promise.race() 静态方法接受一个 promise 可迭代对象作为输入,并返回一个 Promise。这个返回的 promise 会随着第一个 promise 的敲定而敲定。

  • 谁先完成就返回谁的Promise
  • 无论是成功的结果还是失败的结果
    const p1 = new Promise((resolve,rejected) => {
        setTimeout(() => {
            resolve("Mission 1 ok");
            // rejected("Mission 1 fail");
        },1000);
    });
    const p2 = new Promise((resolve,rejected) => {
        setTimeout(() => {
            resolve("Mission 2 ok");
            // rejected("Mission 2 fail");
        },2000);
    });
    const p3 = new Promise((resolve,rejected) => {
        setTimeout(() => {
            resolve("Mission 3 ok");
            // rejected("Mission 3 fail");
        },3000);
    });
    Promise.race([p1, p2, p3])
    .then((res) => {
        console.log(res);
    })
    .catch((err) => {
        console.log(err);
    })
  • 通过改变三个 setTimeout() 方法的第二个参数来改变执行完成的顺序
  • 可以选择分别注释不同的 resolverejected 来改变何种结果的Promise先完成
  • 观察控制台现象
© 版权声明

相关文章