三分钟学会用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随机生成字母数字组合的字符串 随机动画数字
Sep 02 Javascript
AngularJS入门教程之AngularJS 模板
Aug 18 Javascript
js仿手机页面文件下拉刷新效果
Oct 14 Javascript
bootstrap vue.js实现tab效果
Feb 07 Javascript
浅谈JS函数节流防抖
Oct 18 Javascript
React Component存在的几种形式详解
Nov 06 Javascript
cocos2dx+lua实现橡皮擦功能
Dec 20 Javascript
百度小程序之间的页面通信过程详解
Jul 18 Javascript
浅谈javascript错误处理
Aug 11 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
Mar 11 Javascript
基于VUE实现判断设备是PC还是移动端
Jul 03 Javascript
微信小程序实现左滑删除效果
Nov 18 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与SQL注入攻击[三]
2007/04/17 PHP
调整PHP的性能
2013/10/30 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
Python实现端口复用实例代码
2014/07/03 Python
Python对列表排序的方法实例分析
2015/05/16 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
详解Python3 pickle模块用法
2019/09/16 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
销售业务员岗位职责
2014/01/29 职场文书
家长给小学生的评语
2014/01/30 职场文书
给校长的建议书300字
2014/05/16 职场文书
求职意向书
2014/07/29 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
php去除数组中为0的元素的实例分析
2021/11/17 PHP
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android