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服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
NodeJS 实现手机短信验证模块阿里大于功能
Jun 19 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
Sep 19 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
Jul 31 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
nodejs require js文件入口,在package.json中指定默认入口main方法
Oct 10 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实现图片裁剪、添加水印效果代码
2014/10/01 PHP
php获取远程文件大小
2015/10/20 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
Yii框架安装简明教程
2020/05/15 PHP
Gird事件机制初级读本
2007/03/10 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
编写v-for循环的技巧汇总
2020/12/01 Javascript
Python使用gensim计算文档相似性
2016/04/10 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
python argparser的具体使用
2019/11/10 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
司机职责范本
2014/03/08 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
新教师岗前培训方案
2014/06/05 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
安全责任书
2015/01/29 职场文书
写给老婆的保证书
2015/02/27 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
导游词之广州陈家祠
2019/10/21 职场文书