Bootstrap

浅谈Promise怎么取消或中断

用了这么久的Promise,写一下他的几种中断或者取消方案吧。

1、Promises/A+标准:原Promise对象的状态将跟新对象保持一致。

利用这一特性,当新对象保持“pending”状态时,原Promise链将会中止执行。

Promise.resolve().then(() => {
    console.log('ok1')
    return new Promise(()=>{})  // 返回“pending”状态的Promise对象
}).then(() => {
    // 后续的函数不会被调用
    console.log('ok2')
}).catch(err => {
    console.log('err->', err)
})
复制代码

2、Promise.race竞速方法

利用这一特性,也能达到后续的Promise不再执行

let p1 = new Promise((resolve, reject) => {
    resolve('ok1')
})

let p2 = new Promise((resolve, reject) => {
    setTimeout(() => {resolve('ok2')}, 10)
})

Promise.race([p2, p1]).then((result) => {
    console.log(result) //ok1
}).catch((error) => {
    console.log(error)
})
复制代码

3、当Promise链中抛出一个错误时,错误信息沿着链路向后传递,直至被捕获。

利用这一特性能跳过链中被捕获前的函数的调用,直至链路终点。

Promise.resolve().then(() => {
    console.log('ok1')
    throw 'throw error1'
}).then(() => {
    console.log('ok2')
}, err => {     
    // 捕获错误
    console.log('err->', err)
}).then(() => {   
    // 该函数将被调用
    console.log('ok3')
    throw 'throw error3'
}).then(() => {
    // 错误捕获前的函数不会被调用
    console.log('ok4')
}).catch(err => {
    console.log('err->', err)
})
复制代码

小马,献丑了,欢迎大家指出错误,一起交流交流。

喜欢的点个赞吧。 大家加油!

转载于:https://juejin.im/post/5cc093635188252e754f2239

;