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中SSL服务的性能
Jul 15 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
Jan 07 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 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 友好URL的实现(吐血推荐)
2008/10/04 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
php中inlcude()性能对比详解
2012/09/16 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python封装对象实现时间效果
2020/04/23 Python
Django如何配置mysql数据库
2018/05/04 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
本科生个人求职自荐信
2013/09/26 职场文书
学生学习总结的自我评价
2013/10/22 职场文书
新学期主题班会
2015/08/17 职场文书
化工生产实习心得体会
2016/01/22 职场文书
Mysql binlog日志文件过大的解决
2021/10/05 MySQL
python基础之错误和异常处理
2021/10/24 Python
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers