详解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 相关文章推荐
javascript 面向对象编程 function也是类
Sep 17 Javascript
js面向对象 多种创建对象方法小结
May 21 Javascript
js完美解决IE6不支持position:fixed的bug
Apr 24 Javascript
PHP结合jQuery实现的评论顶、踩功能
Jul 22 Javascript
实例解析jQuery中proxy()函数的用法
May 24 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
Jun 21 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
全面总结Javascript对数组对象的各种操作
Jan 22 Javascript
JS库之Waypoints的用法详解
Sep 13 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
Dec 08 Javascript
微信小程序使用swiper组件实现层叠轮播图
Nov 04 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
Sep 21 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
生成php程序的php代码
2008/04/07 PHP
如何使用php输出时间格式
2013/08/31 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
使用requests库制作Python爬虫
2018/03/25 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
总经理岗位职责
2013/11/09 职场文书
庆六一宣传标语
2014/10/08 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
十二生肖观后感
2015/06/12 职场文书
关于五一放假的通知
2015/08/18 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
Redis入门基础常用操作命令整理
2022/06/01 Redis