一.回调地狱的含义

回调地狱:异步任务函数无法保证代码按照顺序执行,我们利用嵌套回调函数强行让代码按照顺序执行,但是它会让我们的代码可读性很差,不利于后期的维护

二.如何解决回调地狱

方法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

  1. async关键字,他作为一个关键字放到声明函数前面,表示该函数为一个异步任务,不会阻塞后面函数的执行

  2. await关键字只能在使用async定义的函数中使用
    ​ await后面可以直接跟一个 Promise实例对象(可以跟任何表达式,更多的是跟一个返回Promise对象的表达式)
    await函数不能单独使用
    await可以直接拿到Promise中resolve中的数据。

    为什么叫await等待呢,因为当代码执行到async函数中的await时,代码就在此处等待不继续往下执行,知道await拿到Promise对象中resolve的数据,才继续往下执行,这样就保证了代码的执行顺序,而且使异步代码看起来更像同步代码。