promise的缺点之一就是没法让promise中断ajax
Promise.resolve().then(() => { console.log('then 1') }).then(() => { console.log('then 2') }).then(() => { console.log('then 3') }).catch((err) => { console.log(err) })
如上代码如何让promise的链式调用中断?promise
Promise.resolve().then(() => { console.log('then 1') throw new Error('xxx') }).then(() => { console.log('then 2') }).then(() => { console.log('then 3') }).catch((err) => { console.log(err) })
Promise.resolve().then(() => { console.log('then 1') return new Promise(() => {}) }).then(() => { console.log('then 2') }).then(() => { console.log('then 3') }).catch((err) => { console.log(err) })
假设咱们要用promsie本身封装一个ajax, 设置超时中断时间,若是没返回就不用返回了, 返回也不作处理了,不重要(虽然和上面的原理不要紧,但不重要,上面是一个promsie的链式调用中断,此例是实际应用中的问题,你管我用几个promsie呢, 想到了记录一下)code
function wrap(p1) { let abort let p2 = new Promise((resolve, reject) => { abort = reject }) let p = Promise.race([p1, p2]) // 将延时promise的reject方法挂在到p1与p2的race后的promise上, 能够在方法外经过调用p的cancel方法,来触发p2的reject p.cancel = abort return p } let fn = wrap(new Promise((resolve, reject) => { // 假设1秒后ajax返回, 调用resolve setTimeout(() => { resolve() }, 1000) })) fn.then(() => { console.log('ok') }).catch(() => { console.log('err') }) // 设置延时时间500ms, 若是500ms数据买回来,就中断 setTimeout(() => { fn.cancel() }, 500)