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 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
我们枚举第一个经过的坏点,然后DP即可. 状态转移方程不是难点,难点在于组合数的处理. 将狼踩尽的博客中有很详细的证明过程,但是我只记住了结论 $n=a_1 * p^k+a_2*p^k-1...$ $ ...
- BZOJ2245 [SDOI2011]工作安排 【费用流】
题目 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名 ...
- linux虚拟机无法上网 Network is unreachable
系统centos 安装ftp时报错 Couldn't resolve host 'mirrorlist.centos.org [root@wulihua bin]# yum install vsft ...
- LA 2797 平面区域dfs
题目大意:一个平面区域有n条线段,问能否从(0,0)处到达无穷远处(不穿过任何线段) 分析:若两条线段有一个端点重合,这种情况是不能从端点重合处穿过的 的.因此对每个端点延长一点,就可以避免这个问题. ...
- 表单禁用复制、粘贴、及右击菜单(contextmenu、oncopy、oncut、onpaste、onselectstart)
禁用右键菜单,可以使用oncontextmenu属性: <textarea oncontextmenu="return false"></textarea> ...
- jQuery事件委托之Safari失效的解决办法--摘抄
什么是事件委托 事件委托是Jquery中一种事件绑定的方式,不同于常见的事件绑定方式将事件绑定在目标元素上,而是将事件绑定在父级元素上通过事件冒泡来执行绑定函数. //常见的事件绑定(Jquery) ...
- Python入门--4--分之和循环
1.用ELIF比较省CPU: 第一种方法,使用if score = int(input('请输入你的分数:')) if (score <= 100) and (score >= 90): ...
- R语言入门视频笔记--1
一.数据框简要 可输入来访问mtcars这个系统自带的数据框中的mpg列 mtcars$mpg 或者输入 mtcars[c("mpg","cyl")] 来访问两 ...
- iOS 取应用版本
// 应用网址 返回字典中有多种数据 NSString *urlString2 = [NSString stringWithFormat: @"%@", @"http: ...
- java使用jxl,自动导出数据excle,quartz自动发送邮件
=============JAVA后台代码===================== package com.qgc.service.autoSendMsg.AutoSendMsg import ja ...