async/await与promise(nodejs中的异步操作问题)

 更新时间:2017年03月03日 11:09:41   作者:晴天_雨天  
这篇文章主要介绍了async/await与promise(nodejs中的异步操作问题),非常不错,具有参考借鉴价值,需要的朋友可以参考下

举例写文章详情页面的时候的一个场景:首先更改文章详情中的 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中的异步操作问题),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 使用node操作SQLite的方法

    使用node操作SQLite的方法

    SQLite是一种轻量级的嵌入式关系型数据库管理系统,它以库的形式存在,可以嵌入到应用程序中,使用Node.js操作SQLite数据库有多种方式,其中常用的方式包括使用sqlite3模块、sequelize模块和knex模块,本文将详细的给大家介绍这几种方式,需要的朋友可以参考下
    2023-10-10
  • 基于Nodejs实现文件压缩和解压功能

    基于Nodejs实现文件压缩和解压功能

    在 windows 系统上面,我们压缩文件,常常需要安装一些压缩软件才能实现压缩,可能有些还存在一些问题,所以本文就来使用Nodejs实现文件压缩和解压功能吧
    2024-03-03
  • node.js实现登录注册页面

    node.js实现登录注册页面

    这篇文章主要为大家详细介绍了node.js实现简单的登录注册页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • NodeJS爬虫实例之糗事百科

    NodeJS爬虫实例之糗事百科

    本篇文章主要给大家讲解了一下用NodeJS学习爬虫,并通过爬糗事百科来讲解用法和效果,一起学习下吧。
    2017-12-12
  • 详解koa2学习中使用 async 、await、promise解决异步的问题

    详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 基于Node.js的http模块搭建HTTP服务器

    基于Node.js的http模块搭建HTTP服务器

    这篇文章主要为大家介绍了基于Node.js的http模块来搭建HTTP服务器的示例过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • 前端如何更好的展示后端返回的十万条数据

    前端如何更好的展示后端返回的十万条数据

    这篇文章主要为大家介绍了前端如何更好的展示后端返回的十万条数据,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • Node爬取大批量文件的方法示例

    Node爬取大批量文件的方法示例

    这篇文章主要介绍了Node爬取大批量文件的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Node.js开启Https的实践详解

    Node.js开启Https的实践详解

    最近因为工作需要,需要将网站切换到了https。其实去年就想迁的迁移过去,但是资金紧缺就找了个免费的证书,实际效果不是很好。但是最近腾讯云推出了免费的ssl证书申请。楼主是亲测有效的。下面通过本文来一起看看Node.js开启Https的详细步骤吧,有需要的可以参考借鉴。
    2016-10-10
  • 基于Node.js模板引擎教程-jade速学与实战1

    基于Node.js模板引擎教程-jade速学与实战1

    下面小编就为大家带来一篇基于Node.js模板引擎教程-jade速学与实战1。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论