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的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
nodejs中实现路由功能
Dec 29 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
深入理解nodejs中Express的中间件
May 19 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
详解NodeJS模块化
Jun 15 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
php下MYSQL limit的优化
2008/01/10 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
vue实现公共方法抽离
2020/07/31 Javascript
vue实现选中效果
2020/10/07 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python snownlp情感分析简易demo(分享)
2017/06/04 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
自我评价200字分享
2013/12/17 职场文书
迟到检讨书800字
2014/01/13 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
成事在人观后感
2015/06/16 职场文书
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫