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的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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防注
2007/01/15 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
jQuery 性能优化指南 (1)
2009/05/21 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
基于python3的socket聊天编程
2020/02/17 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
python3实现飞机大战
2020/11/29 Python
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
小学班长竞选演讲稿
2014/04/24 职场文书
整顿机关作风心得体会
2014/09/10 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
护士2015年终工作总结
2015/04/29 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
网络研修随笔感言
2015/11/18 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
python如何读取和存储dict()与.json格式文件
2022/06/25 Python