ITPub博客

首页 > 应用开发 > Html/css > 好程序员web前端培训分享如何讲清楚async和await?

好程序员web前端培训分享如何讲清楚async和await?

原创 Html/css 作者:好程序员 时间:2020-05-06 10:43:01 0 删除 编辑

  好程序员 web前端培训 分享如何讲清楚async和 await ? async 和 await 要搭配 Promise 使用 ,  它进一步极大的改进了 Promise 的写法

 

来看一个简单的场景:

 

//假设有 4 个异步方法要按顺序调用

new Promise(function(resolve){

    ajaxA("xxxx", ()=> { resolve(); })    

}).then(function(){

    return new Promise(function(resolve){

        ajaxB("xxxx", ()=> { resolve(); })    

    })

}).then(function(){

    return new Promise(function(resolve){

        ajaxC("xxxx", ()=> { resolve(); })    

    })

}).then(function(){

    ajaxD("xxxx");

});  

语法上不够简洁, 我们可以稍微改造一下

 

//将请求改造成一个通用函数

function request(options) {

    //.....

    return new Promise(....); //使用 Promise 执行请求 , 并返回 Promise 对象

}

//于是我们就可以来发送请求了

request("http://xxxxxx")

.then((data)=>{

    //处理 data

})

 

 

然后我们再来重新改造开头的代码

 

request("ajaxA")

.then((data)=>{

   //处理 data

   return request("ajaxB")

})

.then((data)=>{

   //处理 data

   return request("ajaxC")

})

.then((data)=>{

   //处理 data

   return request("ajaxD")

})

 

 

比起之前有了不小的进步, 但是看上去依然不够简洁

 

如果我能像使用同步代码那样, 使用 Promise 就好了

 

于是, async \ await出现了

 

async function load(){

    await request("ajaxA");

    await request("ajaxB");

    await request("ajaxC");

    await request("ajaxD");

}

 

await关键字使用的要求非常简单 ,  后面调用的函数要返回一个 Promise 对象

load()这个函数已经不再是普通函数 ,  它出现了 await 这样 " 阻塞式 " 的操作

因此async关键字在这是不能省略的

那么现在看, 这段代码变得异常清秀

 

代码的编写顺序

 

代码的阅读顺序

 

代码的执行顺序

 

全部都是按照同步的习惯来的

 

是不是很方便.

 

 

到这你已经学会了async和 await 基本使用方式

 

下面来简单解释一下它的工作流程

 

//wait这个单词是等待的意思

async function load(){

    await request("ajaxA");  //那么这里就是在等待 ajaxA 请求的完成

    await request("ajaxB");

    await request("ajaxC");

    await request("ajaxD");

}

如果后一个请求需要前一个请求的结果怎么办呢?

 

传统的写法是这样的

 

request("ajaxA")

.then((data1)=>{

   return request("ajaxB", data1);

})

.then((data2)=>{

   return request("ajaxC", data2)

})

.then((data3)=>{

   return request("ajaxD", data3)

})

而使用async/await是这样的

 

async function load(){

    let data1 = await request("ajaxA");  

    let data2 = await request("ajaxB", data1);

    let data3 = await request("ajaxC", data2);

    let data4 = await request("ajaxD", data3);

    //await不仅等待 Promise 完成 ,  而且还拿到了 resolve 方法的参数

}

注意当一个函数被async修饰以后 ,  它的返回值会被自动处理成 Promise 对象

 

关于异常处理

 

async function load(){

    //请求失败后的处理 ,  可以使用 try-catch 来进行

    try{

        let data1 = await request("ajaxA");  

        let data2 = await request("ajaxB", data1);

        let data3 = await request("ajaxC", data2);

    } catch(e){

        //......

    }

}

 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69913864/viewspace-2690036/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-03-20

  • 博文量
    342
  • 访问量
    195074