1.什么是回调地狱?
答:回调函数不会立即执行,只有当满足一定条件后或等待一段时间后才会执行。例如定时器和ajax中就使用了回调函数。
存在异步任务的代码,不能按照顺序执行,为了得到我们想要的顺序,可以在回调函数中嵌套回调函数,当出现多级嵌套时,就形成了回调地狱。代码不具备可读性、难以维护。
function getTea (fn) {
setTimeout(() => {
fn('奶茶')
}, 1000)
}
function getHotPot (fn) {
setTimeout(() => {
fn('火锅')
}, 2000)
}
// getTea(function(data) {
// console.log(data)
// }) 喝奶茶
//先吃火锅,再喝奶茶
getHotPot(function(data) {
console.log(data)
getTea(function(data) {
console.log(data)
getTea(function(data) {
console.log(data)
getTea(function(data) {
console.log(data)
})
})
})
})
2.promise
function getTea () {
return new Promise(function(resolve) {
setTimeout(() => {
resolve('奶茶')
}, 1000)
})
}
function getHotPot () {
return new Promise(function(resolve) {
setTimeout(() => {
resolve('火锅')
}, 1000)
})
}
getHotPot().then(data => {
console.log(data);
return getTea();
}).then(data => {
console.log(data);
return getTea();
}).then(data => {
console.log(data)
})
3.async与await实现
//async
function getTea () {
return new Promise(function(resolve) {
setTimeout(() => {
resolve('奶茶')
}, 1000)
})
}
function getHotPot () {
return new Promise(function(resolve) {
setTimeout(() => {
resolve('火锅')
}, 2000)
})
}
async function getData () {
let hotPot = await getHotPot()
console.log(hotPot)
let tea = await getTea()
console.log(tea)
}
// 调用async函数
getData()