Node中的promise简说及入门
Node的特色之一就是异步回调,可是回调过多,就会形成著名的回调金字塔。
直接上例子,我要读取1.txt里的内容,然后在这个内容上加上'test'并重新写入文件,如下代码所示:
var fs = require('fs');
fs.readFile('./1.txt', 'utf-8', function (err, msg) {
if (err) {
console.log(err);
} else {
fs.writeFile('./1.txt', msg + 'test', 'utf-8', function (err) {
if (err) {
console.log(err);
} else {
fs.readFile('./1.txt', 'utf-8', function (err, msg) {
if (err) {
console.log(err);
} else {
console.log(msg);
}
})
}
})
}
})
那么如何解决这种金子塔型的代码呢?方法很多,在这里我们只介绍一种,那就是使用Promise,在node中我们可以通过Q来实现Promise~
我们来了解下promise基础知识。
1.promise可以将金字塔代码风格变为链式。
2.then是promise的核心方法,我们可以用这个方法从异步中获得返回值或者跑出异常,then方法有两个可选的参数,都是callback函数,分别是onFulfilled 和 onRejected,promise被解决时(异步处理已经完成)会调用onFulfilled 和 onRejected 。因为只会有一种结果,所以这两个函数中仅有一个会被触发。
3.then返回的是promise
下来我们把上面的代码用Q来实现,代码如下:
var Q = require('q');
//1.写一个读取文件的方法,将它封装成promise
function fs_readFile(file, encoding) {
var deferred = Q.defer();
fs.readFile(file, encoding, function (err, data) {
if (err) deferred.reject(err);
else deferred.resolve(data);
})
return deferred.promise;
}
//2.写一个写入文件方法,将它封装成promise
function fs_writeFile(data, file, encoding) {
var deferred = Q.defer();
fs.writeFile(file, data, encoding, function (err) {
if (err) deferred.reject(err);
else deferred.resolve('ok');
})
return deferred.promise;
}
//3.实现逻辑
fs_readFile('./1.txt', 'utf-8')
.then(function (data) {return fs_writeFile(data + 'test', './1.txt', 'utf-8')})
.then(function(){return fs_readFile('./1.txt', 'utf-8')})
.then(console.log,console.error);
上面的例子我们是用Q.defer可以手动创建promise。当然还可以使用另外的方式来创建promise,如Q.denodeify。
Q && promise很强大,需要大家用心用时间自己去体会,先简单介绍到这吧。
Node中的promise简说及入门的更多相关文章
- 深入理解jQuery、Angular、node中的Promise
最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...
- 在node中使用promise上传图片到七牛云
为了分摊个人服务器压力.提升图片下载上传的速度,使用七牛云保存用户上传的图片. 后台基于express搭建的,上传使用七牛云第三方nodejs-sdk.由于七牛云上传图片只能单个进行,并且考虑到上传完 ...
- 快速入门上手JavaScript中的Promise
当我还是一个小白的时候,我翻了很多关于Promise介绍的文档,我一直没能理解所谓解决异步操作的痛点是什么意思 直到我翻了谷歌第一页的所有中文文档我才有所顿悟,其实从他的英文字面意思理解最为简单粗暴 ...
- node.js Web应用框架Express入门指南
node.js Web应用框架Express入门指南 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-28 我要评论 这篇文章主要介绍了node.js Web应用框架Express入门 ...
- 深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
第一部分,Promise 加入 ES6 标准 原文地址 http://www.cnblogs.com/wangfupeng1988/p/6515855.html 未经作者允许不得转载! 从 jquer ...
- IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端
IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端 原文:http://docs.identityserver.io/en/release/quicks ...
- node中非常重要的process对象,Child Process模块
node中非常重要的process对象,Child Process模块Child Process模块http://javascript.ruanyifeng.com/nodejs/child-proc ...
- MongoDB 极简实践入门
原作者StevenSLXie; 原链接(https://github.com/StevenSLXie/Tutorials-for-Web-Developers/blob/master/MongoDB% ...
- 浏览器和Node 中的Event Loop
前言 js与生俱来的就是单线程无阻塞的脚本语言. 作为单线程语言,js代码执行时都只有一个主线程执行任务. 无阻塞的实现依赖于我们要谈的事件循环.eventloop的规范是真的苦涩难懂,仅仅要理解的话 ...
随机推荐
- 【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)
题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. ——信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳 ...
- BZOJ 4824 [Cqoi2017]老C的键盘 ——树形DP
每一个限制条件相当于一条有向边, 忽略边的方向,就成了一道裸的树形DP题 同BZOJ3167 唯一的区别就是这个$O(n^3)$能过 #include <map> #include < ...
- PHP html_entity_decode() 函数
html_entity_decode(string,flags,character-set) 把 HTML 实体转换为字符. html_entity_decode() 函数是 htmlentities ...
- mongo安装-docker
拉取官方镜像(可以自己使用dockerFile构建): docker search mongo //查询Docker Hub 上的mongo镜像 docker pull mongo // 拉取官方镜像 ...
- golang 进程、线程、协程 简介
https://www.cnblogs.com/shenguanpu/archive/2013/05/05/3060616.html https://studygolang.com/articles/ ...
- AC日记——A+B Problem(再升级) 洛谷 P1832
题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛滥趋势 ·以上纯属个人吐槽 ·给定一个正整数n ...
- saltstack 开发相关命令记录
SALT API开发相关命令记录. 查看当前的salt key信息salt-key -L 测试被控主机的连通性salt '*' test.ping 远程命令执行测试salt '*' cmd.run ' ...
- python文件追加及时间获取
一.python:文件的读取.创建.追加.删除.清空 2011-10-24 11:36:35| 分类: python |举报 |字号 订阅 一.用Python创建一个新文件,内容是从0到9的整数 ...
- Codeforces Round #320 (Div. 2) [Bayan Thanks-Round]
一部分题解,算是自己SB了 上午的TC 也是这样 写好了代码,却一直没注意细节,然后以为错了. 此处省100字,ps 貌似紫了,作为一个老菜鸡,终于紫了 A,B 都是语文题 C: 给以一个三角形一样的 ...
- [转] sql 删除表数据的drop、truncate和delete用法
删除表数据的关键字,大家记得最多的可能就是delete.然而,我们做数据库开发,读取数据库数据.对另外的drop.truncate用得就比较少了. 1 drop 出没场合:drop table ta ...