初步的链式调用
new Promise((resolve, reject) => {
ajax('static/a.json', res => {
console.log(res)
resolve()
})
}).then(res => {
console.log('a成功')
return new Promise((resolve, reject) => {
ajax('static/b.json', res => {
console.log(res)
resolve()
})
})
}).then(res => {
console.log('b成功')
return new Promise((resolve, reject) => {
ajax('static/c.json', res => {
console.log(res)
resolve()
})
})
}).then(res => {
console.log('c成功')
})
console的打印结果依次是:
代码的初步优化
function getPromise(url) {
return new Promise((resolve, reject) => {
ajax(url, res => {
resolve(res)
})
});
}
getPromise('static/a.json')
.then(res => {
console.log(res)
return getPromise('static/b.json')
})
.then(res => {
console.log(res)
return getPromise('static/c.json')
})
.then(res => {
console.log(res)
});
代码简洁了很多,并且可读性增强了。避免回调地狱的出现
为何要将 getPromise()
进行 return
处理, 因为getPromise()
方法返回的是一个promise
对象,如果不return
,就会默认返回一个 空的 Promise
对象,打印的时候会输出undefined
Promise的错误处理catch
getPromise('static/aa.json')
.then(res => {
console.log(res)
return getPromise('static/b.json')
})
.then(res => {
console.log(res)
return getPromise('static/c.json')
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
因为static/aa.json
文件不存在,所以promise
是无法执行下去,会报错,利用catch
捕获报错,直接停止运行后面的promise
函数catch
可以看做是 promise
的错误 统一处理
最终处理finally
可以用finally
来处理弹出框的销毁promise
请求不管成功还是失败,之后都会执行finally
方法
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
// reject('fail')
}, 1000)
}).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
}).finally(() => {
console.log('finally')
});