async/await与promise(nodejs中的异步操作问题)


Posted in NodeJs onMarch 03, 2017

举例写文章详情页面的时候的一个场景:首先更改文章详情中的 PV,然后读取文章详情,然后根据文章详情中文章 Id 查阅该文章评论和该文章作者信息。获取全部数据之后渲染文章详情页。数据库操作都是异步的,最直接想到的办法就是一层一层的回调函数,问题出来了:十分不雅观,要是层再多一点还会有更多麻烦。怎么解决?业内为了处理异步操作问题也是拼了,什么async,q,bluebird,co,处理方式不同,各有千秋,感兴趣可以了解一下,但是惊喜的发现nodejs 7.6已经默认支持ES7中的 async/await 了,结合ES6中的 promise对象,用起来不亦乐乎的。

Async/await的主要益处是可以避免回调地狱(callback hell)问题。

基本概念:

async 表示这是一个async函数,await只能用在这个函数里面。

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

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

捕捉错误:

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

 在循环中:

var start = async function () {
  for (var i = 1; i <= 10; i++) {
    console.log(`当前是第${i}次等待..`);
    await sleep(1000);
  }
};

再循环中使用不需要闭包,每次循环会被阻塞。

最前面提到的场景:(综合使用)

var showArticle = async function () {
    await new Promise(function (resolve, reject) {
      PostModel.incPv(postId, function (result) {
        resolve(result);
      });
    });// pv 加 1
    var post = await new Promise(function (resolve, reject) {
      PostModel.getPostById(postId, function (article) {
        resolve(article);
      });
    });// 获取文章信息
    await new Promise(function (resolve, reject) {
      userModel.getUserById(post.author,function (author) {
        post.author=author;
        resolve();
      })
    });//获取文章作者
    var comments = await new Promise(function (resolve, reject) {
      CommentModel.getComments(post._id, function (comment) {
        resolve(comment);
      });
    });// 获取该文章所有留言
    for(var i=0;i<comments.length;i++){
      await new Promise(function (resolve, reject) {
        userModel.getUserById(comments[i].author,function (author) {
          comments[i].author=author;
          resolve();
        })
      });//获取文章留言作者
    }
    if (!post) {
      req.session.error = '该文章不存在';
      return res.redirect('/post');
    }
    res.render('post',{post: post, comments: comments});
  };
  showArticle();

以上所述是小编给大家介绍的async/await与promise(nodejs中的异步操作问题),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

NodeJs 相关文章推荐
nodejs之请求路由概述
Jul 05 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
基于NodeJS的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
May 15 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 #NodeJs
NodeJS仿WebApi路由示例
Feb 28 #NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 #NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 #NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 #NodeJs
NodeJS配置HTTPS服务实例分享
Feb 19 #NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 #NodeJs
You might like
一步一步学习PHP(2)――PHP类型
2010/02/15 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
讲解Python中运算符使用时的优先级
2015/05/14 Python
python处理数据,存进hive表的方法
2018/07/04 Python
python线程中的同步问题及解决方法
2019/08/29 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
python爬虫可以爬什么
2020/06/16 Python
python实例化对象的具体方法
2020/06/17 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
英国绿色商店:Natural Collection
2019/05/03 全球购物
市场营销方案范文
2014/03/11 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
实习报告评语
2014/04/26 职场文书
企业宣传工作方案
2014/06/02 职场文书
班级读书活动总结
2014/06/30 职场文书
企业读书活动总结
2014/06/30 职场文书
关于学习的决心书
2015/02/05 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
2019感恩宣传标语!
2019/07/05 职场文书