对promise不熟悉的同学,可以看看下面代码的运行结果,反正我刚开始是懵懵的哈哈
// 在then或catch中手动返回一个Promise
;(function () {
var promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
}, 500)
})
var promise2 = promise1.then((res) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
// resolve('accept')
reject(new Error('refuse'))
}, 500)
})//.catch(err => { console.log(err.message) })
})//.catch(err => { console.log(err.message) })
promise2.catch((err) => { console.log(err.message) })
// 注意上面两个注释起来的catch也能抓住'refuse',但如果是上面两个抓住的,1200ms的最后输出,promise2就不是reject,而是<resolved>:undefined
setTimeout(() => {
console.log(promise1, promise2)
}, 300)
setTimeout(() => {
console.log(promise1, promise2)
}, 800)
setTimeout(() => {
console.log(promise1, promise2)
}, 1200)
})()
// 下面的代码和上面的区别在于promise1的then中不是在return new Promise中setTimeout,而是在setTimeout中return new Promise
;(function () {
var promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
}, 500)
})
var promise2 = promise1.then((res) => {
setTimeout(() => {
return new Promise((resolve, reject) => {
// resolve('accept')
reject(new Error('refuse'))
})//.catch(err => { console.log(err.message) })
}, 500)
})//.catch(err => { console.log(err.message) })
promise2.catch((err) => { console.log(err.message) })
// 对于这种情况,只有return new Promise后面紧跟的catch能抓住'refuse'(也就是三个catch中的第一个catch)
// 并且,无论是resolve('accept')还是reject(new Error('refuse')),500ms后promise2的状态一直都是<resolved>:undefined状态
setTimeout(() => {
console.log(promise1, promise2)
}, 300)
setTimeout(() => {
console.log(promise1, promise2)
}, 800)
setTimeout(() => {
console.log(promise1, promise2)
}, 1200)
})()
展开