回调函数?
当一个函数被当做参数传递时,这个函数就叫做回调函数- callback
通常使用回调函数来处理异步代码
当异步代码执行结束后,需要执行的代码就要放在回调函数中
回调地狱?
当回调函数嵌套太多,就容易产生回调地狱 - 一行比一行缩进的厉害 - 牵一发而动全身
类似于这种(代码不重要,主要看形式):
sendAjax({
url: 'http://localhost:8888/test/first',
dataType: 'text',
success: res => {
console.log('完成---first');
sendAjax({
url: 'http://localhost:8888/test/second',
success: res => {
console.log('完成---second');
sendAjax({
url: 'http://localhost:8888/test/third',
data: {
name: '张三',
age: 13,
},
success: res => {
console.log('完成---third');
}
})
}
})
}
})
promise语法解决回调地狱
ES6中提供的promise语法可以解决回调地狱 - 嵌套语法变成链式语法
1. new一个promise对象
var p = new Promise(function(resolve,reject){
//在这里发送ajax就好了
//成功 - 调用resolve
resolve()
//失败 - 调用reject
reject()
})
其中,参数有两个:
① resolve 成功时所调用的函数
② reject 失败时所调用的函数
注意:这两个参数函数只会执行其中一个,不可能两个都执行,或都不执行
2. new出来的promise对象 p, 有两个方法: - then - catch
① 当调用 resolve 就会执行 then
p.then(function()){
console.log('成功')
}
② 当调用 reject 就会执行 catch
p.catch(function()){
console.log(失败')
}
(链式语法)注意:
如果在 then 中 return 一个 promise对象,里面那个小的promise对象的then就可以卸载外面那个大的promise的then后面,形成链式操作
new Promise(function(resolve, reject) {
reject(2222) //只会执行一个
resolve(1111)
}).then(function() {
return new Promise()
}).then(function() {
return new Promise()
}).then(function() {
return new Promise()
}).catch(function() {
console.log(str);
})
回调地狱的终极解决办法
ES7的语法: - async - await
具体在这篇文章: