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异步回调的优雅处理方法
Sep 25 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
Nodejs实战心得之eventproxy模块控制并发
Oct 27 NodeJs
Nodejs中 npm常用命令详解
Jul 04 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 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 引用文件技巧
2010/03/02 PHP
php 文件上传实例代码
2012/04/19 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
2014/08/22 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
tornado+celery的简单使用详解
2019/12/21 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
Python过滤序列元素的方法
2020/07/31 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
土木工程专业个人求职信
2013/12/05 职场文书
关于运动会的稿件
2014/02/02 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
物业品质提升方案
2014/06/08 职场文书
忠诚教育心得体会
2014/09/03 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
优秀大学生自荐信
2015/03/26 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL