三分钟学会用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 相关文章推荐
学习ExtJS(二) Button常用方法
Oct 07 Javascript
在jQuery中 关于json空对象筛选替换
Apr 15 Javascript
浏览器的JavaScript引擎的识别方法
Oct 20 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
js检测浏览器版本、核心、是否移动端示例
Apr 24 Javascript
2014年50个程序员最适用的免费JQuery插件
Dec 15 Javascript
AspNet中使用JQuery boxy插件的确认框
May 20 Javascript
jQuery的事件委托实例分析
Jul 15 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
Jul 12 Javascript
vue渲染时闪烁{{}}的问题及解决方法
Mar 28 Javascript
微信小程序实现的一键复制功能示例
Apr 24 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 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
PHP中的日期处理方法集锦
2007/01/02 PHP
php 过滤器实现代码
2010/08/09 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
extjs render 用法介绍
2013/09/11 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python实现的udp协议Server和Client代码实例
2014/06/04 Python
Python面向对象进阶学习
2019/05/21 Python
python操作cfg配置文件方式
2019/12/22 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
通过css3动画和opacity透明度实现呼吸灯效果
2019/08/09 HTML / CSS
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
毕业生就业推荐信范文
2013/12/01 职场文书
高中化学教学反思
2014/01/13 职场文书
新学期教师寄语
2014/04/02 职场文书
航空学院求职信
2014/06/11 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
毕业证代领委托书
2014/09/26 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
道歉短信大全
2015/05/12 职场文书
Python pygame实现中国象棋单机版源码
2021/06/20 Python
关于nginx 实现jira反向代理的问题
2021/09/25 Servers