细谈回调地狱终极解决方案及ES7新语法async和await

Posted 我是真的不会前端

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了细谈回调地狱终极解决方案及ES7新语法async和await相关的知识,希望对你有一定的参考价值。

1.回调地狱的一般解决方案

正常情况下,我们都知道用promise去解决回调地狱。通过其调用then 和catch方法来实现回调函数多层嵌套问题。但是,我们可以实际来仔细看看用promise解决回调地狱的方法和问题所在。

//假设我们有两个数据库。 area.php传递一个城市的区域。city.php传递城市名。
//我们现在要通过ajax传递参数
promiseAjax({
    url:"area.php",
    data:{
        name:"南山区"
    }
}).then(res=>{
    // console.log(res);
    var {pid} = res;
    // 根据这个pid找到对应的市 - 市的pid - 省的id
    return promiseAjax({
        url:"city.php",
        data:{
            id:pid
        }
    })
}).then(res=>{
    // console.log(res);
    var {pid} = res;
    // 根据这个id查询到省份
    return promiseAjax({
        url:"province.php",
        data:{
            id:pid
        }
    })
}).then(res=>{
    console.log(res);
})

仔细看这段代码。这个时候不难发现。其实es6提供的promise解决回调地狱的时候,将嵌套结构做成了链式结构,所有代码都是一个完整的整体。从某个意义上来说。这种解决回调地狱的方法。不够完美

ES7新语法:回调地狱的终极解决方案

首先:他可以将异步代码写的和同步代码一样。
async和await是关键字,async异步的,await等待 - 等待异步执行
/可以等待异步代码执行结束后继续往后执行 - 将异步代码变的跟同步代码一样啦
async修饰函数的 我们可以直接写在函数体前面例如

async function fn(){};

async function fn(){
    // await必须在async修饰的函数内部使用
    // await用来修饰一个promise对象
    var res = await promiseAjax({ // await可以等待promise中异步操作有了结果
        url:"area.php",
        data:{
            name:"宝安区"
        }
    })

    // console.log(res);
    var {pid} = res;
    var city = await promiseAjax({
        url:"city.php",
        data:{
            id:pid
        }
    })

    console.log(city);
    var {pid} = city;

    var province = await promiseAjax({
        url:"province.php",
        data:{
            id:pid
        }
    })

    console.log(province);
}
fn()

await是在等待promise的引用结果。这个结果还可以在外面接收回来。这样,我们可以不用再去promise写then。因为之前我们因为结果我要操作结果,现在await是等结果。本来的同步代码应该在异步结果之前执行。然而这里因为await在等待结果。所以等同于同时行进。
那这样写好处什么呢:我们可以把同步当异步写。使得代码更易于维护。

以上是关于细谈回调地狱终极解决方案及ES7新语法async和await的主要内容,如果未能解决你的问题,请参考以下文章

Node.js回调地狱及使用Promiseasync和await函数的解决方法

Node.js Promise对象(解决回调地狱问题)async和await函数

async/await 的基础使用及原理简介

Promise,async/await解决回调地狱

wepack打包时出错不压缩代码及使用es7(async await)新语法问题

js异步解决方案及promise基础