Promise有关API

    技术2024-11-09  21

    Promise

    promise三种状态

    FulfilledRejectedPending

    Promise.resolve

    静态方法Promise.resolve(value)可以认为是new Promsie()的快捷方式,比如Promise.resolve(43);可以认为是以下代码的语法糖:

    new Promise(function(resolve) { resolve(43) })

    这段代码中的resolve(42);会让这个promise对象立即进入成功状态,该方法的返回值也是一个promise对象,我们可以像下面接着对其返回值进行.then调用。

    Promise.resolve(43).then((value) => {console.log(value)})

    Promise.resolve作为new Promise()的快捷方式,在进行promise对象的初始化或者编写测试代码的时候都非常方便。

    Promise.reject

    Promise.reject(error)是和Promise.resolve(value)类似的静态方法,是new Promise()方法的快捷方式。

    比如Promise.reject(new Error(“出错了”))就是下面代码的语法糖形式。

    new Promise((resolve, reject) => { reject(new Error("出错了")); }) Promise.reject(new Error("出错了")).catch(error => { console.error(error); })

    它和Promise.resolve(value)的不同之处在于promise内调用的函数是reject而不是resolve,这在编写测试代码或者进行debug时说不定用得上。

    promise chain (promise链)

    function taskA() { console.log("taskA"); } function taskB() { console.log("taskB"); } function finalTask() { console.log("finalTask"); } function rejected(err) { console.log(err); } Promise .resolve() .then(taskA) .then(taskB) .catch(rejected) .then(finalTask);

    上面的promise链执行顺序为:

    若task出现异常时

    function taskA() { console.log("taskA"); throw new Errow("这是一个错误") } function taskB() { console.log("taskB"); } function finalTask() { console.log("finalTask"); } function rejected(err) { console.log(err); } Promise .resolve() .then(taskA) .then(taskB) .catch(rejected) .then(finalTask); //最后结果为taskA 报错 finalTask

    此时会跳过taskB,按照taskA -> rejected -> finalTask这个流程来处理

    promise链中参数的传递

    上面的例子中task都是独立的,只是简单被调用而已,这时如果taskA想给taskB传递一个参数该怎么办那?

    function taskA(count) { console.log("taskA", count); return count; } function taskB(count) { console.log("taskB", count + 1); return count + 1; } function taskC(count) { console.log("taskC", count * 2); return count * 2; } Promise.resolve(1).then(taskA).then(taskB).then(taskC); //最后结果为 //taskA 1 //taskB 2 //taskC 4

    Promise的常用方法

    Promise.all([]).then(res => {}).catch(err => {}),该方法返回一个Promise实力,只有当[]中的所有promise完成后才会执行,一旦有一个promise被拒绝,则执行失败回调,catch方法会捕捉到首个被执行的reject函数。Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的Promise.allSettled([]).then(results => {});当给定的promise数组中的所有promise被拒绝后会返回一个拒绝的promise数组,与[]一一对应。Promise.any([]).then().catch;当promise数组中有任意一个完成时就会终止,会忽略到所有被拒绝掉的promise,直到第一个promise完成。若传入所有的promise被拒绝则会执行拒绝回调Promise.race([]).then().catch();当promise数组中任意一个promise被拒绝或者成功,则会采用第一个promise作为他的返回值,但其余的promise还是会继续执行。
    Processed: 0.009, SQL: 9