JS基于ES6新特性async await进行异步处理操作示例


Posted in Javascript onFebruary 02, 2019

本文实例讲述了JS基于ES6新特性async await进行异步处理操作。分享给大家供大家参考,具体如下:

我们往往在项目中会遇到这样的业务需求,就是首先先进行一个ajax请求,然后再进行下一个ajax请求,而下一个请求需要使用上一个请求得到的数据,请求少了还好说,如果多了,就要一层一层的嵌套,就好像有点callback的写法了,那是相当恶心的,下面我就来讲一下如何使用ES6的新特性async await进行异步处理,使上述情况就好像写同步代码一样,首先我们先举个例子:

先写上json文件:

code.json:

{
  "code":0,
  "msg":"成功"
}

person.json:

{
  "code":0,
  "list":[
    {
      "id":1,
      "name":"唐僧"
    },
    {
      "id":2,
      "name":"孙悟空"
    },
    {
      "id":3,
      "name":"猪八戒"
    },
    {
      "id":4,
      "name":"沙僧"
    }
  ]
}

比如我们有两个请求,如下,这里用的axios:

function getCode(){
  return axios.get('json/code.json');
}
function getlist(params){
  return axios.get('json/person.json',{params})
}

我们第二个请求获取列表的时候需要使用第一个请求得到的code值,只有code值为0时,才能请求,而且当做参数传进去,那么我们看一下常规的做法吧

function getFinal(){
   console.log("我是getFinal函数")
   getCode().then(function(res){
     if(res.data.code == 0){
        console.log(res.data.code);
         var params = {
           code:res.data.code
         }
        getlist(params).then(function(res){
          if(res.data.code == 0){
             console.log(res.data.list);
            }
          })
        }
     })
}
getFinal();

看结果

JS基于ES6新特性async await进行异步处理操作示例

虽然结果出来了,可是这种写法真的挺难受的,下面来一个async await的写法

async function getResult(){
      console.log("我是getResult函数")
      let code = await getCode();
      console.log(code.data.code);
      if(code.data.code == 0){
        var params = {
          code:code.data.code
        }
        let list = await getlist(params);
        console.log(list.data.list);
      }
    }
getResult();

下面看结果

JS基于ES6新特性async await进行异步处理操作示例

当然还剩最后一点,处理异常,可以加上try catch

async function getResult(){
      console.log("我是getResult函数")
      try{
        let code = await getCode();
        console.log(code.data.code);
        if(code.data.code == 0){
          var params = {
            code:code.data.code
          }
          let list = await getlist(params);
          console.log(list.data.list);
        }
      }catch(err){
        console.log(err);
      }
    }
getResult();

个人认为做vue项目的时候,如果对于异常没有特殊处理,可以不加try catch,因为打印出来的错误跟vue自己报的错误是一样的,而且还是黑的字体,不如醒目的红色来的痛快啊!当然如果要对错误进行特殊处理,那么就加上吧

代码风格是不是简便了许多,而且异步代码变成了同步代码,下面我稍微讲一下后者写法的代码执行顺序

首先在 function 前面加 async 用来说明这个函数是一个异步函数,当然,async是要和await配合使用的,第一个请求

let code = await getCode();

await 意思是等一下,等着getCode()这个函数执行完毕,得到值后再赋值给code,然后再用code的值进行下一步操作,就是这么简单!!!赶紧去改代码!!

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Javascript 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
jQuery隔行变色与普通JS写法的对比
Apr 21 Javascript
node.js中的fs.fchown方法使用说明
Dec 16 Javascript
开启Javascript中apply、call、bind的用法之旅模式
Oct 28 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
Jan 14 Javascript
jquery中键盘事件小结
Feb 24 Javascript
深入浅析Vue组件开发
Nov 25 Javascript
vue-router 权限控制的示例代码
Sep 21 Javascript
Angular4集成ng2-file-upload的上传组件
Mar 14 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
Aug 23 Javascript
ES10的13个新特性示例(小结)
Sep 23 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 #Javascript
JS使用对象的defineProperty进行变量监控操作示例
Feb 02 #Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
Feb 02 #Javascript
通过cordova将vue项目打包为webapp的方法
Feb 02 #Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 #Javascript
JS实现数组去重及数组内对象去重功能示例
Feb 02 #Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
Feb 01 #Javascript
You might like
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
PHP防注入安全代码
2008/04/09 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
node中的session的具体使用
2018/09/14 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
python和opencv实现抠图
2018/07/18 Python
详解python中init方法和随机数方法
2019/03/13 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
2019/04/29 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
Python函数式编程实例详解
2020/01/17 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
关于Assembly命名空间的三个面试题
2015/07/23 面试题
质检员岗位职责
2015/02/03 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
战马观后感
2015/06/08 职场文书
研讨会致辞
2015/07/31 职场文书