详解node Async/Await 更好的异步编程解决方案


Posted in Javascript onMay 10, 2018

一、异步编程的终极解决方案

前几天写过关于 javascript 异步操作的文章《Javascript Promise 详解》. 最近在学习 Puppeteer 的时候又发现另一种异步编程解决方案:Async/Await.

异步操作是 JavaScript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。 从最早的回调函数,到 Promise 对象,再到 Generator 函数,每次都有所改进,但又让人觉得不彻底。 它们都有额外的复杂性,都需要理解抽象的底层运行机制。

在 Async 函数出来之后,有人认为它是异步编程的最终解决方案。因为有了 Async/Await 之后,你根本就不用关心是它是不是异步编程。

二、基本用法

async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。 当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。

下面是一个栗子:

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。

三、注意事项

1、await 命令只能用在 async 函数之中,如果用在普通函数,就会报错。

async function dbFuc(db) {
 let docs = [{}, {}, {}];

 // 报错
 docs.forEach(function (doc) {
  await db.post(doc);
 });
}

2、await 表示在这里等待promise返回结果了,再继续执行。

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'
};

3、await 后面跟着的应该是一个promise对象。

如果是同步执行的代码没有必要使用 await 修饰了。

4、await 只能使用在原生语法中,比如在 forEeach 结构中使用 await 是无法正常工作的,必须使用 for 循环的原生语法。

async function dbFuc(db) {
 let docs = [{}, {}, {}];

 // 可能得到错误结果
 docs.forEach(async function (doc) {
  await db.post(doc);
 });
}

如果确实希望多个请求并发执行,可以使用 Promise.all 方法。

async function dbFuc(db) {
 let docs = [{}, {}, {}];
 let promises = docs.map((doc) => db.post(doc));

 let results = await Promise.all(promises);
 console.log(results);
}

四、错误捕获

既然.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`
  }
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
键盘 keycode的值 javascript时触发事件时很有用的要素
Nov 02 Javascript
bootstrap输入框组代码分享
Jun 07 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
May 31 Javascript
JQuery EasyUI的一些常用组件
Jul 12 jQuery
详谈表单重复提交的三种情况及解决方法
Aug 16 Javascript
js实现随机点名系统(实例讲解)
Oct 18 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
Nov 28 Javascript
Vue 换肤的示例实践
Jan 23 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
Mar 07 Javascript
微信小程序实现富文本图片宽度自适应的方法
Jan 20 Javascript
JavaScript回调函数callback用法解析
Jan 14 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
Jul 28 Javascript
Javascript Promise用法详解
May 10 #Javascript
jQuery实现模糊查询的方法分析
May 10 #jQuery
async/await地狱该如何避免详解
May 10 #Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
May 10 #Javascript
JS中的JSON对象的定义和取值实现代码
May 09 #Javascript
js循环map 获取所有的key和value的实现代码(json)
May 09 #Javascript
js合并两个数组生成合并后的key:value数组
May 09 #Javascript
You might like
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
详解vue中axios的封装
2018/07/18 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
python生成requirements.txt的两种方法
2019/09/18 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
大学生新闻专业个人自我评价
2013/11/12 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
针对吵架老公保证书
2015/05/08 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
Apache POI的基本使用详解
2021/11/07 Servers