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 相关文章推荐
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
Dec 27 Javascript
jquery显示和隐藏div特效实例
Feb 27 Javascript
原生js操作checkbox用document.getElementById实现
Oct 12 Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
jQuery中removeClass()方法用法实例
Jan 05 Javascript
使用JavaScript实现旋转的彩圈特效
Jun 23 Javascript
快速学习jQuery插件 Cookie插件使用方法
Dec 01 Javascript
基于bootstrap实现广告轮播带图片和文字效果
Jul 22 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
Js中将Long转换成日期格式的实现方法
Jun 05 Javascript
手把手教您实现react异步加载高阶组件
Apr 07 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中使用base HTTP验证的方法
2015/04/20 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
浅谈python字符串方法的简单使用
2016/07/18 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
python常见排序算法基础教程
2017/04/13 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
Python的互斥锁与信号量详解
2019/09/12 Python
ipad上运行python的方法步骤
2019/10/12 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
Python 远程开关机的方法
2020/11/18 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
ET Mall东森购物网:东森严选
2017/03/06 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
毕业生多媒体设计求职信
2013/10/12 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
护士岗位职责
2014/02/16 职场文书
中学生学雷锋演讲稿
2014/04/26 职场文书
岗位职责说明书模板
2014/07/30 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
个人合伙协议书范本
2014/10/14 职场文书
避暑山庄导游词
2015/02/04 职场文书
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python