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 相关文章推荐
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
14款NodeJS Web框架推荐
Jul 11 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 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
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
jQuery实现统计复选框选中数量
2014/11/24 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
javascript实现动态标签云
2015/10/16 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
电信专业应届生自荐信
2013/09/28 职场文书
校园网站的创业计划书范文
2013/12/30 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
初三学生个人自我评定
2014/04/06 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python
python 下划线的多种应用场景总结
2021/05/12 Python
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
Python OpenCV实现图像模板匹配详解
2022/04/07 Python