三分钟学会用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 相关文章推荐
Tinymce+jQuery.Validation使用产生的BUG
Mar 29 Javascript
js 第二代身份证号码的验证机制代码
May 12 Javascript
JS子父窗口互相操作取值赋值的方法介绍
May 11 Javascript
javascript中undefined与null的区别
Aug 16 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
Nov 07 Javascript
JavaScript对Json的增删改属性详解
Jun 02 Javascript
从零学习node.js之express入门(六)
Feb 25 Javascript
Vue.js开发环境快速搭建教程
Mar 17 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
Feb 13 jQuery
基于Vue 服务端Cookies删除的问题
Sep 21 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 Javascript
three.js如何实现3D动态文字效果
Mar 03 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获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
ext combobox动态加载数据库数据(附前后台)
2014/06/17 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python爬虫与反爬虫大战
2020/07/30 Python
python将数据插入数据库的代码分享
2020/08/16 Python
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
创先争优活动党员公开承诺书
2014/08/29 职场文书
毕业典礼主持词
2015/06/29 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
你喜欢篮球吗?Python实现篮球游戏
2021/06/11 Python
使用 Apache 反向代理的设置技巧
2022/01/18 Servers
springboot layui hutool Excel导入的实现
2022/03/31 Java/Android
详解MySQL的内连接和外连接
2023/05/08 MySQL