回调地狱及解决办法(Promise,async/await)
回调地狱
-
由多层嵌套的回调函数组成的代码称为回调地狱,多数在写阻塞执行代码的时候会产生。回调地狱的代码可读性差,很难让人弄清楚业务逻辑。
下面便是回调地狱的代码:
function callbackFn(callback){
setTimeout(function(){
callback()
},1000)
}
callbackFn(function(){
callbackFn(function(){
callbackFn(function(){
callbackFn(function(){console.log('回调结束')})
})
})
})
上面的代码执行4秒后会输出’回调结束‘,虽然达到了我们要阻塞执行的目的,但是非常不容易让人读懂,且书写麻烦。
Promise
- Promise 对象用于表示一个异步操作的最终完成 (或失败),
及其结果值。通过promise返回then的链式调用可以解决回调地狱的问题
function callbackFn(name){
return new Promise(function(resolve, reject){
setTimeout(function(){
console.log(name)
resolve()
},1000)
})
}
callbackFn(111).then(
function(){return callbackFn(222)}
).then(
function(){return callbackFn('回调结束')}
)
async/await
async是协同Promise工作的,放置在函数前面,返回一个Promise对象,关键词await可以让JavaScript进行等待,直到一个promise执行并返回它的结果,JavaScript才会继续往下执行,await只能在async定义的函数内部执行。
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve('done!'), 1000)
})
let result = await promise
alert(result)
}
f()