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中数组的冒泡排序使用示例
Dec 18 Javascript
jQuery操作元素css样式的三种方法
Jun 04 Javascript
JS基于Mootools实现的个性菜单效果代码
Oct 21 Javascript
Bootstrap开发实战之第一次接触Bootstrap
Jun 02 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
Jun 26 Javascript
过期软件破解办法实例详解
Jan 04 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
Jan 26 Javascript
js实现产品缩略图效果
Mar 10 Javascript
Bootstrap table表格初始化表格数据的方法
Jul 25 Javascript
关于angular浏览器兼容性问题的解决方案
Jul 26 Javascript
详解Vue数据驱动原理
Nov 17 Javascript
JavaScript圣杯布局与双飞翼布局实现案例详解
Aug 05 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
session在PHP大型web应用中的使用
2011/06/25 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
php引用传值实例详解学习
2013/11/06 PHP
PHP答题类应用接口实例
2015/02/09 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
Python探索之自定义实现线程池
2017/10/27 Python
Python切片工具pillow用法示例
2018/03/30 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
python3 下载网络图片代码实例
2019/08/27 Python
python处理RSTP视频流过程解析
2020/01/11 Python
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
酒店员工培训方案
2014/06/02 职场文书
人力资源职位说明书
2014/07/29 职场文书
电影焦裕禄观后感
2015/06/09 职场文书
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS