三分钟学会用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实现图片切换的幻灯片效果源代码
Dec 12 Javascript
红米手机抢购的js代码
Mar 10 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
Dec 07 Javascript
浅谈javascript中onbeforeunload与onunload事件
Dec 10 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
Node.js+Express配置入门教程详解
May 19 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
May 30 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
浅谈在Vue-cli里基于axios封装复用请求
Nov 06 Javascript
node.js部署之启动后台运行forever的方法
May 23 Javascript
示例vue 的keep-alive缓存功能的实现
Dec 13 Javascript
create-react-app中添加less支持的实现
Nov 15 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实现框架(一)
2006/10/09 PHP
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
js实现省市级联效果分享
2017/08/10 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
JavaScript实现点击图片换背景
2020/11/20 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
django fernet fields字段加密实践详解
2019/08/12 Python
pytorch实现线性拟合方式
2020/01/15 Python
python调用百度API实现人脸识别
2020/11/17 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
印尼旅游网站:via
2017/11/12 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
安全员岗位职责
2013/11/11 职场文书
自考生自我评价分享
2014/01/18 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
设备售后服务承诺书
2014/05/30 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
2015年药房工作总结
2015/04/25 职场文书
员工聘用合同范本
2015/09/21 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
Python标准库pathlib操作目录和文件
2021/11/20 Python
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis
MySQL Server层四个日志的实现
2022/03/31 MySQL