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框架Express的模板视图机制分析
Jul 19 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
详解nodejs 文本操作模块-fs模块(一)
Dec 22 NodeJs
详解nodejs操作mongodb数据库封装DB类
Apr 10 NodeJs
nodeJS服务器的创建和重新启动的实现方法
May 12 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 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 COOKIE设置为浏览器进程
2009/06/21 PHP
js改变文章字体大小的实例代码
2013/11/27 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
使用Python的内建模块collections的教程
2015/04/28 Python
浅谈Python单向链表的实现
2015/12/24 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
基于python实现查询ip地址来源
2020/06/02 Python
浅谈Python中的字符串
2020/06/10 Python
Django xadmin安装及使用详解
2020/10/26 Python
浅析Python的命名空间与作用域
2020/11/25 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
资深地理教师自我评价
2013/09/21 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
2014年庆元旦活动方案
2014/02/15 职场文书
环保倡议书怎么写
2014/05/16 职场文书
初中班级口号
2014/06/09 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
班主任自我评价范文
2015/03/11 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技