一.回调地狱的含义
回调地狱:异步任务函数无法保证代码按照顺序执行,我们利用嵌套回调函数强行让代码按照顺序执行,但是它会让我们的代码可读性很差,不利于后期的维护
二.如何解决回调地狱
方法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的数据,才继续往下执行,这样就保证了代码的执行顺序,而且使异步代码看起来更像同步代码。