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 事件流和事件绑定
Jul 16 Javascript
js本身的局限性 别让javascript做太多事
Mar 23 Javascript
jquery乱码与contentType属性设置问题解决方案
Jan 07 Javascript
JQuery 图片的展开和伸缩实例讲解
Apr 18 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
Jun 20 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
Sep 06 Javascript
node.js require() 源码解读
Dec 13 Javascript
jquery动态创建div与input的实例代码
Oct 12 Javascript
jQuery实现的简单拖动层示例
Feb 22 Javascript
关于JS与jQuery中的文档加载问题
Aug 22 jQuery
vue excel上传预览和table内容下载到excel文件中
Dec 10 Javascript
Typescript类型系统FLOW静态检查基本规范
May 25 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
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
PHP常用的三种设计模式
2017/02/17 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
js通过canvas生成图片缩略图
2020/10/02 Javascript
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
Python中偏函数用法示例
2018/06/07 Python
python使用多进程的实例详解
2018/09/19 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Python如何给函数库增加日志功能
2020/08/04 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
匡威英国官网:Converse英国
2018/12/02 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
思想品德自我鉴定
2013/10/12 职场文书
学校安全工作制度
2014/01/19 职场文书
校庆接待方案
2014/03/18 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
小学感恩主题班会
2015/08/12 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
Go语言安装并操作redis的go-redis库
2022/04/14 Golang
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang