async/await与promise(nodejs中的异步操作问题)
作者:晴天_雨天 发布时间:2024-04-22 22:43:39
标签:promise,async,await,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中的异步操作问题)网站的支持!
来源:http://www.cnblogs.com/lihuanqing/archive/2017/03/03/6495020.html


猜你喜欢
- 1.学习sql之前回忆一下,什么是变量?变量:能存储数据的值。变量是一块内存空间的表示。数组一连串空间变量是存储数据的容器(通俗讲)2.变量
- 作为WIMP(Window/Icon/Menu/Pointing Device)界面设计的关键部分,图标在人机交互设计中无所不在。随着人们对
- 背景最近在用Electron开发一款应用,其中有涉及到检测因特网是否断开的需求。Electron基于Chromium和Node.js,让你可
- 要做到这一点,就要尽量地使用缓存,经常地从缓存中获得以前的消息。幸运的是目前大多数WAP设备都有一定级别的缓存,在默认情况下,会尝试最大化的
- 本文实例讲述了Python实现的弹球小游戏。分享给大家供大家参考,具体如下:弹球1. Ball 类draw负责移动Ball碰撞检测,反弹,B
- PYTHON 操作 XML读取XML文件关于XML的介绍<data> 与 </data> 是一对标签的开始与结束&l
- 如何在页面错误时向数据库中添加记录?在ASP中,我在页面中添加了On Error Resume Next错误命令,以消除和避免程序错误。现在
- 前言删除列表中的元素十分简单,有很多方法。使用最多的是remove方法,remove() 方法从集合中删除指定的元素。此方法与discard
- 一、前奏在谈回调函数之前,先看下下面两段代码:不妨猜测一下代码的结果。function say (value) {  
- sql2000安全很重要将有安全问题的SQL过程删除.比较全面.一切为了安全!删除了调用shell,注册表,COM组件的破坏权限use&nb
- MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Redu
- 随着python的发展越来越好,用python的伙伴也越来越多。本人刚开始接触python的时候用的第一个集成环境就是Anaconda,因为
- 前几天因为一个例外,数据库在没有做备份的情况下,直接删除了表记录。事后,又需要查询到删除的记录的内容。因此,在网上软件SS了半天,发现Log
- 1、前言由于笔者并未系统地学习过Python,对Python某些底层的实现细节一概不清楚,以至于在实际使用的时候会写出一些奇奇怪怪的Bug(
- golang数组去重利用map可以利用go中,map数据类型的key唯一的属性,来对数组去重将strSlice数组中重复的元素去掉,使其中的
- 不管是哪个版本的Ubuntu,安装mysql数据库基本上都是大同小异。下面介绍一下具体的安装步骤:1、打开终端,并取得root权限2、在终端
- 阅读上一篇:定义网页的语言编码 用web标准设计网站,过渡的方法主要是采用XHTML+CSS,css样式表是必不可少的。这就要求所有网页设计
- 慢查询首先,无论进行何种优化,开启慢查询都算是前置条件。慢查询机制,将记录过慢的查询语句(事件),从而为DB维护人员提供优化目标。检查慢查询
- 引言pycharm 在运行后会产生大量的配置文件并默认存入C盘中,这样会占据大量的空间,因此,我们需要更改配置文件的位置。通过查询一些资料,
- 小编最经常的工作是将一些项目的数据从数据库导出,然后分门别类的列到excel表格中,领导看起来眼花缭乱。小编想,要是能以图表可视化展现出来,