21、promise.then()返回的新promise对象的结果状态由什么决定

119 阅读2分钟

21、promise.then()返回的新promise对象的结果状态由什么决定?

let p = new Promise((ressolve, reject) => {
    resolve("OK")
})
//执行then方法

let result = p.then(value =>{
    console.log(value)
    
    //如果这里抛出异常,result会变为失败 比如 throw "error"
    
    //如果返回结果是非Promise类型的对象  result会变为成功 比如return 123
    
    //如果返回的结果是promise对象, result就是这个Promise对象的结果
}, reason => {
    console.warn(reason)
})

console.log(resilt)
//结果是promise对象


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

如果抛出异常,新promise变为rejected, reason为抛出的异常
如果返回的是非promise的任意值,新promise变为resolved, value为返回的值
如果返回的事另一个新promise, 此promise的结果就会成为新promise的结果

22、串联多个任务

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)
        //这里会显示success, 输出时机是一秒钟之后
    }).then(value => {
        console.log(value)
        //这里会输出undefinde,因为上一个then 没有return
    })
})

23、promise异常穿透

  1. 当使用promise的then链式调用时,可以再最后指定失败的回调
  2. 前面任何操作出了异常,都会穿到最后失败的回调中处理
let p = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("OK")
    },1000)
    
    p.then(value => {
        console.log(111)
    }).then(value=>{
        console.log(222)
    }).then(value => {
        console.log(333)
    }).catch(reason => {
        console.warn(reason)
    })
    
    //这样会显示111、222、333
    //如果 resolve("OK")变为 reject("Err)
    //则会显示 Err
    //这种现象称为异常穿透
})

24、如何中断promise链

有且只有一个方法,返回一个pending状态的promise对象
let p = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("OK")
    },1000)
    
    p.then(value => {
        console.log(111)
        
        //有且只有一个方法,返回一个pending状态的promise对象
        return new Promise(() => {})
    }).then(value=>{
        console.log(222)
    }).then(value => {
        console.log(333)
    }).catch(reason => {
        console.warn(reason)
    })
    
    
})