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获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
nodejs入门教程一:概念与用法简介
Apr 24 NodeJs
NodeJs模拟登陆正方教务
Apr 28 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
May 15 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
Nov 01 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简介
2006/10/09 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
Python制作exe文件简单流程
2019/01/24 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
python 深度学习中的4种激活函数
2020/09/18 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
教师简历自我评价
2014/02/03 职场文书
党员干部承诺书
2014/03/25 职场文书
住房租房协议书
2014/08/20 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
舌尖上的中国观后感
2015/06/02 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书