三分钟学会用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 相关文章推荐
jQuery的12招常用技巧分享
Aug 08 Javascript
Jquery动态更改一张位图的src与Attr的使用
Jul 31 Javascript
AngularJS的一些基本样式初窥
Jul 27 Javascript
jqTransform美化表单
Oct 10 Javascript
一次$.getJSON不执行的简单记录
Jul 19 Javascript
Bootstrap实现各种进度条样式详解
Apr 13 Javascript
简单实现vue验证码60秒倒计时功能
Oct 11 Javascript
AngularJS实现图片上传和预览功能的方法分析
Nov 08 Javascript
vue实现前进刷新后退不刷新效果
Jan 26 Javascript
vue使用ajax获取后台数据进行显示的示例
Aug 09 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 Javascript
微信小程序与webview交互实现支付功能
Jun 07 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文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
python实现代码行数统计示例分享
2014/02/10 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
ubuntu中配置pyqt4环境教程
2017/12/27 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
Python pandas用法最全整理
2019/08/04 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
详解Python多线程下的list
2020/07/03 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
如何基于Python按行合并两个txt
2020/11/03 Python
思想品德自我评价
2014/02/04 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
走群众路线学习笔记
2014/11/06 职场文书
2014年药房工作总结
2014/11/22 职场文书
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
MySQL常见优化方案汇总
2022/01/18 MySQL