三分钟学会用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 相关文章推荐
Javascript在IE或Firefox下获取鼠标位置的代码
Dec 18 Javascript
javascript dom 基本操作小结
Apr 11 Javascript
jQuery数据显示插件整合实现代码
Oct 24 Javascript
js中符号转意问题示例探讨
Aug 19 Javascript
获得Javascript对象属性个数的示例代码
Nov 21 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
Feb 03 Javascript
初步使用bootstrap快速创建页面
Mar 03 Javascript
D3.js实现直方图的方法详解
Sep 25 Javascript
js实现添加删除表格(两种方法)
Apr 27 Javascript
JS异步错误捕获的一些事小结
Apr 26 Javascript
微信小程序实现同一页面取值的方法分析
Apr 30 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
Sep 28 Javascript
详解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的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
JavaScript中for-in遍历方式示例介绍
2014/02/11 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
python中subprocess批量执行linux命令
2018/04/27 Python
linux安装python修改默认python版本方法
2019/03/31 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
python3 map函数和filter函数详解
2019/08/26 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
大学生简历中个人的自我评价
2013/10/06 职场文书
毕业生动漫设计求职信
2013/10/11 职场文书
校园报刊亭创业计划书
2014/01/02 职场文书
高中军训感言600字
2014/03/11 职场文书
质量承诺书怎么写
2014/05/24 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
综治工作汇报材料
2014/10/27 职场文书
感动中国何玥观后感
2015/06/02 职场文书