关于Promise,你必须知道的几点。

1.如何改变promise的状态

  1). resolve(value) 如果当前的状态是pedding 就会改为 resolved

  2). reject(reason) 如果当前状态是pedding 就会改为 rejected

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

  当promise状态改变时,对应的回调函数都会调用

const p = new Promise((resolve,reject)=>{
    resolve(1)
})
p.then(
    value=>{
        console.log(value)   // 1
    },
    reason=>{
        console.log(reason)
    }
)
p.then(
    value=>{
        console.log('value2:' + value)   // value2:1
    },
    reason=>{
        console.log('reason2' + reason)
    }
)

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

  1). 都有可能,正常情况下时先指定回调函数再改变状态,但也可以先改变状态,再指定回调。

  2). 如何先改变状态,再指定回调函数

    在执行器中直接调用resolve() / reject()

    再延迟更长的时间才调用then

  3). 什么时候才能得到数据

    如果先指定回调函数,当状态改变的时候,回调函数就会被执行,得到数据

    如果先改变状态,那当指定回调时,就会调用回调函数,得到数据

4. promise.then()返回的新的promise的状态由谁决定?

  1). 简单表达:由then()指定的回调函数的执行结果来决定

  2). 详细表达:

    如果回调函数抛出异常,新的promise变为reject,reason为异常的原因

    如果返回的为非promise的任意值,则状态为resolved value为其返回值

    如果返回的为一个新的promise,状态为新的promise的结果

5. promise如何串联多个异步操作任务?

  1). promise的then()返回一个新的promise,可以写成then(). 的链式调用

  2). 通过then 的链式调用串联多个 同步/异步 任务

  说明:如果想在then()中执行异步任务,必须返回一个新的promise不能直接调用 resolve / reject

new Promise((resolve, reject)=>{
    console.log("执行任务1(同步)")
    setTimeout(()=>{
         console.log("执行任务2(异步)")
         resolve(2)
    },1000)
}).then(
    value =>{
        console.log("任务2的结果");
       console.log("执行任务3(同步)");
       return 3 
    }
).then(
    value=>{
        console.log("接受任务3的结果")
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                console.log("执行任务4(异步)")
                resolve(4)
            })
        })
    }
).then(
    value=>{
        console.log("接收任务4的结果")
    }
)

6. promise 异常传透

  1). 当使用promise的then链式调用的时候,可以到最后再指定失败的回调函数

  2). 前面的任意操作出现了异常,都会传到最后的失败的回调中处理

new Promise((resolve,reject)=>{
    reject(2)
}).then(
    value=>{},
    // reason=>{throw reason}
).then(
    value=>{},
    // reason=>{throw reason}
).catch(
    reason=>{
        console.log(reason)
        return new Promise(()=>{})   // 返回一个pending状态的promise ,后面的链式调用就不会继续执行
    }
).then(   // 这里面将不会继续执行
    value=>{
        
    },
    reason=>{
        
    }
)
// 上面的任意一个promise发生错误,都会一层一层的传递到最后一个错误的回调中来处理
// 如果then()中不传递回调函数,就会默认传递  reason => {throw reason} ,将错误往下抛出

7. 如何中断Promise链?

  在回调函数中返回一个pedding状态的promise对象

猜你喜欢

转载自www.cnblogs.com/recode-hyh/p/11945607.html