Promise 二:关键问题

1. 如何改变 promise 的状态?

(1) resolve(value): 如果当前是 pending 就会变为 resolved
(2) reject(reason): 如果当前是 pending 就会变为 rejected
(3) 抛出异常 : 如果当前是 pending 就会变为 rejected

2. 一个 promise 指定多个成功/失败回调函数, 都会调用吗?

promise 改变为对应状态时都会调用
let p = new Promise((resolve, reject) => {
            // resolve('OK');
        });

        ///指定回调 - 1
        p.then(value => {
            console.log(value);
        });

        //指定回调 - 2
        p.then(value => {
            alert(value);
        });

3. 改变 promise 状态和指定回调函数谁先谁后?

(1) 都有可能 , 正常情况下是先指定回调再改变状态, 但也可以先改状态再指定回调(执行器中的任务是同步任务时,直接执行resolve 或 reject 改变状态,然后再then方法指定回调)

(2) 如何先改状态再指定回调?

① 在执行器中直接调用 resolve()/reject()
② 延迟更长时间才调用 then()
        let p = new Promise((resolve, reject) => {
                resolve('OK');
        });

        p.then(value => {
            console.log(value);
        },reason=>{
            
        })


        // 先执行回调,再改变状态

        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });

        p.then(value => {
            console.log(value);
        },reason=>{
            
        })
(3) 什么时候才能得到数据(回调函数什么时候执行) ?
① 如果先指定的回调 , 那当状态发生改变时 , 回调函数才会调用 , 得到数据
② 如果先改变的状态 , 那当指定回调时 , 回调函数就会调用 , 得到数据

4. promise.then()返回的新 promise 的结果状态由什么决定?

(1) 简单表达 : then() 指定的回调函数执行的结果决定
(2) 详细表达 :
① 如果抛出异常 , promise 变为 rejected, reason 为抛出的异常
② 如果返回的是 promise 的任意值, promise 变为 resolved, value 为返回的值,如果没有返回值,新的promise值会变为 resolved,此时输出promise的值为 undefined
③ 如果返回的是另一个新 promise, promise 的结果就会成为新 promise 的结果

5. promise 如何串连多个操作任务?

(1) promise then() 返回一个新的 promise, 可以开成 then() 的链式调用
(2) 通过 then 的链式调用串连多个同步 / 异步任务
        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });

        p.then(value => {
            return new Promise((resolve, reject) => {
                resolve("success");
            });
        }).then(value => {
            console.log(value);
        }).then(value => {
            console.log(value);
        })

// promise success 
// undefined  
//.then的确返回promise对象,但这个对象的值由回调返回的值决定,这里没有声明返回值,所以返回undefined,那么下一个then获取到的值就是undefined,直接打印出来

6. promise 异常传透?

(1) 当使用 promise then 链式调用时 , 可以在最后指定失败的回调 ,
(2) 前面任何操作出了异常 , 都会传到最后失败的回调中处理
        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
                // reject('Err');
            }, 1000);
        });

        p.then(value => {
            // console.log(111);
            throw '失败啦!';
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => {
            console.warn(reason);
        });

// 失败啦

 7. 中断 promise ?

(1) 当使用 promise then 链式调用时 , 在中间中断 , 不再调用后面的回调函数
(2) 办法 : 在回调函数中返回一个 pendding 状态的 promise 对象
        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
            }, 1000);
        });

        p.then(value => {
            console.log(111);
            //有且只有一个方式
            return new Promise(() => {});
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => {
            console.warn(reason);
        });
 // 111

猜你喜欢

转载自blog.csdn.net/csdssdn/article/details/126130422