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的require模块(文件模块/核心模块)及路径介绍
Jan 14 NodeJs
NodeJs基本语法和类型
Feb 13 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 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批量生成缩略图的代码
2008/07/19 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
PHP实现简单日历类编写
2020/08/28 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
2009/10/25 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
2014/02/23 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
vue中路由跳转不计入history的操作
2020/09/21 Javascript
对于Python的框架中一些会话程序的管理
2015/04/20 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Django实现表单验证
2018/09/08 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
大学新闻系求职信
2014/06/03 职场文书
春季运动会开幕词
2015/01/28 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL