三分钟学会用ES7中的Async/Await进行异步编程


Posted in Javascript onJune 14, 2018

本文介绍了三分钟学会用ES7中的Async/Await进行异步编程,分享给大家,具体如下:

Async/Await基本规则

  1. async 表示这是一个async函数,await只能用在这个函数里面。
  2. await 表示在这里等待promise返回结果了,再继续执行。
  3. await 后面跟着的应该是一个promise对象(当然,其他返回值也没关系,只是会立即执行,不过那样就没有意义了…)

一个Async/Await例子

Async/Await应该是目前最简单的异步方案了,首先来看个例子。

这里我们要实现一个暂停功能,输入N毫秒,则停顿N毫秒后才继续往下执行。

var sleep = function (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve();
    }, time);
  })
};

var start = async function () {
  // 在这里使用起来就像同步代码那样直观
  console.log('start');
  await sleep(3000);
  console.log('end');
};

start();

控制台先输出start,稍等3秒后,输出了end。

获得返回值

await等待的虽然是promise对象,但不必写.then(..),直接可以得到返回值。

var sleep = function (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      // 返回 ‘ok'
      resolve('ok');
    }, time);
  })
};

var start = async function () {
  let result = await sleep(3000);
  console.log(result); // 收到 ‘ok'
};

捕捉错误

既然.then(..)不用写了,那么.catch(..)也不用写,可以直接用标准的try catch语法捕捉错误。

var sleep = function (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      // 模拟出错了,返回 ‘error'
      reject('error');
    }, time);
  })
};

var start = async function () {
  try {
    console.log('start');
    await sleep(3000); // 这里得到了一个返回错误
    
    // 所以以下代码不会被执行了
    console.log('end');
  } catch (err) {
    console.log(err); // 这里捕捉到错误 `error`
  }
};

循环多个await

await看起来就像是同步代码,所以可以理所当然的写在for循环里,不必担心以往需要闭包才能解决的问题。

..省略以上代码

var start = async function () {
  for (var i = 1; i <= 10; i++) {
    console.log(`当前是第${i}次等待..`);
    await sleep(1000);
  }
};

值得注意的是,await必须在async函数的上下文中的。

..省略以上代码

let 一到十 = [1,2,3,4,5,6,7,8,9,10];

// 错误示范
一到十.forEach(function (v) {
  console.log(`当前是第${v}次等待..`);
  await sleep(1000); // 错误!! await只能在async函数中运行
});

// 正确示范
for(var v of 一到十) {
  console.log(`当前是第${v}次等待..`);
  await sleep(1000); // 正确, for循环的上下文还在async函数中
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在IE中调用javascript打开Excel的代码(downmoon原作)
Apr 02 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
Aug 08 Javascript
jquery滚动特效集锦
Jun 03 Javascript
js简单工厂模式用法实例
Jun 30 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
谈谈JavaScript类型系统之Math
Jan 06 Javascript
关于Javascript中defer和async的区别总结
Sep 20 Javascript
详谈JavaScript的闭包及应用
Jan 17 Javascript
jQuery实现jQuery-form.js实现异步上传文件
Apr 28 jQuery
select自定义小三角样式代码(实用总结)
Aug 18 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
Jan 06 Javascript
vue+iview实现分页及查询功能
Nov 17 Vue.js
详解React中setState回调函数
Jun 14 #Javascript
JavaScript 判断对象中是否有某属性的常用方法
Jun 14 #Javascript
Vue.js添加组件操作示例
Jun 13 #Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
Jun 13 #Javascript
clipboard.js在移动端复制失败的解决方法
Jun 13 #Javascript
ES6与CommonJS中的模块处理的区别
Jun 13 #Javascript
浅谈webpack 构建性能优化策略小结
Jun 13 #Javascript
You might like
一个简单实现多条件查询的例子
2006/10/09 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
javascript工具库代码
2012/03/29 Javascript
javascript中取前n天日期的两种方法分享
2014/01/26 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
Python实现对象转换为xml的方法示例
2017/06/08 Python
Python命令行解析模块详解
2018/02/01 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
python如何生成网页验证码
2018/07/28 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
python实现KNN分类算法
2019/10/16 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
通信专业个人自我鉴定
2013/10/21 职场文书
资料员的岗位职责
2013/11/20 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
国庆节标语大全
2014/10/08 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
检讨书范文500字
2015/01/28 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
python 网络编程要点总结
2021/06/18 Python