三分钟学会用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 相关文章推荐
js常用自定义公共函数汇总
Jan 15 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
Nov 22 Javascript
JS检测是否可以访问公网服务器功能代码
Jun 19 Javascript
浅谈vue项目重构技术要点和总结
Jan 23 Javascript
详解webpack2异步加载套路
Sep 14 Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 Javascript
详解auto-vue-file:一个自动创建vue组件的包
Apr 26 Javascript
vue-loader中引入模板预处理器的实现
Sep 04 Javascript
JavaScript中继承原理与用法实例入门
May 09 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
Sep 16 Javascript
JavaScript实例 ODO List分析
Jan 22 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
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
php实现数字补零的方法总结
2018/09/12 PHP
js控制框架刷新
2008/08/01 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
python编写简单爬虫资料汇总
2016/03/22 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
大学四年规划书范文
2013/12/27 职场文书
安踏广告词改编版
2014/03/21 职场文书
微笑服务标语
2014/06/24 职场文书
趣味运动会广播稿
2014/09/13 职场文书
师德先进个人材料
2014/12/20 职场文书
工程部岗位职责范本
2015/04/11 职场文书
元旦主持词开场白
2015/05/29 职场文书
单位综合评价意见
2015/06/05 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
详解Python描述符的工作原理
2021/06/11 Python
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers