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 win7下安装方法
May 24 NodeJs
nodejs中exports与module.exports的区别详细介绍
Jan 14 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
浅谈Nodejs应用主文件index.js
Aug 28 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 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学习之数组值的操作
2011/04/17 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
利用PHP实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
event.srcElement+表格应用
2006/08/29 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
Python基于有道实现英汉字典功能
2015/07/25 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
使用Python对MySQL数据操作
2017/04/06 Python
使用python生成目录树
2018/03/29 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
自我鉴定范文300字
2013/10/01 职场文书
关于元旦的广播稿
2014/02/16 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
员工生日会策划方案
2014/06/14 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
工程技术员岗位职责
2015/04/11 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
pytorch通过训练结果的复现设置随机种子
2021/06/01 Python
JS数组方法some、every和find的使用详情
2021/10/05 Javascript