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的规范是真的苦涩难懂,仅仅要理解的话 ...
随机推荐
- BZOJ 3143 [Hnoi2013]游走 ——概率DP
概率DP+高斯消元 与博物馆一题不同的是,最终的状态是有一定的概率到达的,但是由于不能从最终状态中出来,所以最后要把最终状态的概率置为0. 一条边$(x,y)$经过的概率是x点的概率$*x$到$y$的 ...
- SPOJ GSS6 Can you answer these queries VI ——Splay
[题目分析] 增加了插入和删除. 直接用Splay维护就好辣! 写了一个晚上,(码力不精),最后发现更新写挂了 [代码] #include <cstdio> #include <cs ...
- 【bzoj2733】[HNOI2012]永无乡 线段树合并
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- java.util.ResourceBundle 用法小介
java中读取配置文件的信息可以采用properties这个类,但是当遇到国际化问题的时候还是不好解决,因而还是最好使用 ResourceBundle这个类,其实ResourceBundle本质上和P ...
- Biorhythms(poj 1006)
Description 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰 ...
- eclipse 搭建ruby环境
第一步:获取RDT,http://sourceforge.net/projects/rubyeclipse/files/ 解压该文件,获得features和plugins两个文件夹,将这两个文件夹分别 ...
- 【POJ1226】Substrings(后缀数组,二分)
题意: n<=10,len<=100 思路: 只有一个字符串的时候特判一下 #include<cstdio> #include<cstring> #include& ...
- 第2章 CentOS网络配置
一.配置说明 1.1 说明 1.本文以VM仅本机模式下与宿主机的网络配置为例. 1.2 达成目标 1.Windows能ping通centOS 2 centOS能够ping通Windows 3 cent ...
- VisualSVN Server 导入已存在的库
http://blog.csdn.net/lidatgb/article/details/7984220 早些时候建立过一个SVN Server的库,后来觉得库的名字太长了,随意换了一 ...
- HDOJ 4003 Find Metal Mineral
题意: 一棵有权树,从根结点中放入 K 个机器人.求用这 K 个机器人遍历全部的结点最少的权值和. 思路: 1. dp[u][i] 表示给以 u 为根节点的子树放 i 个机器人,遍历其子树所须要的最小 ...