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简说及入门的更多相关文章

  1. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  2. 在node中使用promise上传图片到七牛云

    为了分摊个人服务器压力.提升图片下载上传的速度,使用七牛云保存用户上传的图片. 后台基于express搭建的,上传使用七牛云第三方nodejs-sdk.由于七牛云上传图片只能单个进行,并且考虑到上传完 ...

  3. 快速入门上手JavaScript中的Promise

    当我还是一个小白的时候,我翻了很多关于Promise介绍的文档,我一直没能理解所谓解决异步操作的痛点是什么意思 直到我翻了谷歌第一页的所有中文文档我才有所顿悟,其实从他的英文字面意思理解最为简单粗暴 ...

  4. node.js Web应用框架Express入门指南

    node.js Web应用框架Express入门指南 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-28 我要评论 这篇文章主要介绍了node.js Web应用框架Express入门 ...

  5. 深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise

    第一部分,Promise 加入 ES6 标准 原文地址 http://www.cnblogs.com/wangfupeng1988/p/6515855.html 未经作者允许不得转载! 从 jquer ...

  6. IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端

    IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端 原文:http://docs.identityserver.io/en/release/quicks ...

  7. node中非常重要的process对象,Child Process模块

    node中非常重要的process对象,Child Process模块Child Process模块http://javascript.ruanyifeng.com/nodejs/child-proc ...

  8. MongoDB 极简实践入门

    原作者StevenSLXie; 原链接(https://github.com/StevenSLXie/Tutorials-for-Web-Developers/blob/master/MongoDB% ...

  9. 浏览器和Node 中的Event Loop

    前言 js与生俱来的就是单线程无阻塞的脚本语言. 作为单线程语言,js代码执行时都只有一个主线程执行任务. 无阻塞的实现依赖于我们要谈的事件循环.eventloop的规范是真的苦涩难懂,仅仅要理解的话 ...

随机推荐

  1. 【Luogu】P3116会议时间(拓扑排序,DP)

    题目链接 本题使用拓扑排序来规划DP顺序.设s[i][j]表示i步是否能走到j这个点,e[i][j]表示i步是否能走到j这个点——用第二条路径.因为要满足无后效性和正确性,只有第i个点已经全部更新完毕 ...

  2. BZOJ 2140 稳定婚姻 ——二分图

    论二分图的可行边与必须边. 考虑用dinic增广之后的图,一些是必要的割边,一些是可行的割边. 我们首先求出一组可行的最大匹配,那么这些变都是可行的. 然后我们求一遍强连通分量. 如果 scc[u]! ...

  3. kali 1.1.0 boot failed

    从几个月前的14.10 daily 版本就有U盘刻录无法启动的现象,相关bug可参见:         https://bugs.launchpad.net/ubunt ... reator/+bug ...

  4. Aragorn's Story(hdu3966)

    题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C ...

  5. 批处理BAT替换与截取字符串的用法t1=%a:~3%是什么意思

    在bat编写中,我们经常越到t1=%a:~3%之类的代码,这里简单介绍下用法,需要的朋友可以参考下: 一.替换用法  例  @echo off set a=belcome to CMD borld! ...

  6. LeetCode OJ--Partition List

    http://oj.leetcode.com/problems/partition-list/ 链表的处理 #include <iostream> using namespace std; ...

  7. [bzoj1345][Baltic2007]序列问题_单调栈

    bzoj-1345 Baltic-2007 序列问题 题目大意:对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai ...

  8. pandaboard安装ubuntu14.04系统遇到的问题

    按照该网址步骤安装https://www.eewiki.net/display/linuxonarm/PandaBoard 在linux kernel的./build_kernel.sh时,自动安装交 ...

  9. SGU 乱乱开

    本解题报告 乱抄,乱写,随性随心,不喜多喷! SGU 142: 思路:一个string的字串不会超过2^20个,我们枚举出来就好了. 我出错点:数组RE #include<stdio.h> ...

  10. Java搜索引擎选择: Elasticsearch与Solr(转)

    Elasticsearch简介 Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者 ...