一.回调地狱的含义
回调地狱:异步任务函数无法保证代码按照顺序执行,我们利用嵌套回调函数强行让代码按照顺序执行,但是它会让我们的代码可读性很差,不利于后期的维护
二.如何解决回调地狱
方法1.Promise
Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示。简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。
一般的表现形式为
实例1:
new Promise(
/* executor */
function(resolve, reject) {
if (/* success */) {
// ...执行代码
resolve();
} else { /* fail */
// ...执行代码
reject();
}
}
);实例2:
function fn(msg){
var p=new Promise(function(resolve,reject){
//处理异步任务,resolve成功,reject错误
var flag=true;
setTimeout(function(){
if(flag){
resolve(msg)
}
else{
reject('操作失败')
}
})
})
return p;
}
fn('武林要以和为贵')
.then((data)=>{
console.log(data);
return fn('要讲武德');
})
.then((data)=>{
console.log(data);
return fn('不要搞窝里斗')
})
.then((data)=>{
console.log(data);
})
.catch((data)=>{
console.log(data);
})不断的then有大量的代码冗余.
方法2.async/await
async关键字,他作为一个关键字放到声明函数前面,表示该函数为一个异步任务,不会阻塞后面函数的执行
await关键字只能在使用async定义的函数中使用
await后面可以直接跟一个 Promise实例对象(可以跟任何表达式,更多的是跟一个返回Promise对象的表达式)
await函数不能单独使用
await可以直接拿到Promise中resolve中的数据。为什么叫await等待呢,因为当代码执行到async函数中的await时,代码就在此处等待不继续往下执行,知道await拿到Promise对象中resolve的数据,才继续往下执行,这样就保证了代码的执行顺序,而且使异步代码看起来更像同步代码。

京公网安备 11010502036488号