在开发js过程中,异步操作不能保证执行顺序是我们想象的那样,所以,就出现了“回调地狱”。
所谓的回调地狱就是回调里套回调,一层套一层,可读性极差,在远古时期,使用jQuery发送ajax请求的代码类似于如下,
拿到1的数据请求2,拿到2的数据请求3
// 1
$.ajax({
url: '/api',
data:{ type:1, }
success: function(res) {
console.log('获取数据1:'+res)
// 2
$.ajax({
url: '/api',
data:{ type:res.data, }
success: function(res) {
console.log('获取数据2:'+res)
// 3
$.ajax({
url: '/api',
data:{ type:res.data, }
success: function(res) {
console.log('获取数据3:'+res)
}
})
}
})
}
})
使用Promise之后
function getData(url, data = {}) {
return new Promise((resolve, reject) => {
$.ajax({
url,
data,
success: resolve
error: reject
})
})
}
getData('/api')
.then(res => {
return getData('/api', { id: res.data }))
})
.then(res => {
return getData('/api', { id: res.data })
})
.then(res => {
console.log(res)
})
每一个then的参数函数内我们又调用了个getData函数,即返回了一个Promise对象,这也是Promise的链式调用的关键所在。
缺陷
1、Promise函数改变了之前回调地狱的写法,但是在根本上还是函数套函数,看起来不是那么的美观
2、Promise一经执行,无法中断,除非抛出异常
3、在Promise外部无法通过try/catch的方式捕获Promise内部抛出的异常。