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学习笔记之NET模块
Jan 13 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
async/await与promise(nodejs中的异步操作问题)
Mar 03 NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
Apr 14 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 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
PHP4在Windows2000下的安装
2006/10/09 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
javascript动态加载二
2012/08/22 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
JavaScript中关于base64的一些事
2019/05/06 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
Python采用raw_input读取输入值的方法
2014/08/18 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
Python基础知识点 初识Python.md
2019/05/14 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
亲子运动会的活动方案
2014/08/17 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
谢师宴学生致辞
2015/07/27 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server