Q.js中的几种创建promise对象的方法对比

世界上最远的距离不是生与死的距离,而是文档就在你面前,你依然不知道这个库怎么用。

鄙人IQ不高,已经被Q.js虐了几天。查看了github上kriskowal/q的文档,现在把几种看明白了的使用方法整理记录下来,以下几种方法可以把nodejs中包含callback回调的函数转化为promise风格的代码:

  • Q.nfcall

  • Q.nfapply

  • Q.defer

  • Q.denodeify

首先设定一个使用场景:预期将一个名叫foo.txt的文件读入内存,然后将内容打印出来。

Q.nfcall

nfcall的意思是:Nodejs Function Call,从字面意思来看是用了javascript的call方法,继承原有的方法(类),然后又添加了自己的某些私有方法。用Q.nfcall来实现代码如下:

var fs_readfile=Q.nfcall(fs.readFile,'foo.txt','utf-8');
fs_readfile.then(readA);
function readA(data){
    console.log(data)
}

Q.nfapply

nfapply的意思是:Nodejs Function Apply,从字面意思来看是用了javascript的apply方法。与nfcall相似。用Q.nfapply来实现代码如下:

var fs_readfile=Q.nfapply(fs.readFile,['foo.txt','utf-8']);
fs_readfile.then(readA);
function readA(data){
    console.log(data)
}

Q.defer

用Q.defer来实现的代码如下:

var promise=function(){
    var defer=Q.defer();
    fs.readFile('foo.txt','utf-8',defer.makeNodeResolver());
    return defer.promise;
}
function readA(data){
    console.log(data);
}
promise().then(readA);

Q.denodeify

以上三种方法,都存在一个麻烦的问题:如果我的需求场景变成了首先读入foo.txt文件,然后根据文件中的内容来决定是否调用另一个文件,并且打印出另一个文件的内容。这种场景我们常常会在数据库查找中用到——先查询到某个id,然后在另一个库中根据这个id查到其他某些字段的数据。这就涉及到链式调用。

上面的三种方法,如果在链式调用中我不想让代码变得冗余,写一堆readB、readC……的方法(有些时候甚至究竟链式调用会经历多少步,即要使用多少个then我们事先都不清楚,需要根据获得的数据来动态决定)。

在这种情况下,使用Q.denodeify最合适:

var fs_readfile=Q.denodeify(fs.readFile)
fs_readfile('foo.txt','utf-8')
    .then(readA).then(readA)

function readA(data){
    console.log(data);
    //只要在这里返回新的promise对象,就能把异步执行结果返回给下一个then()方法
    return fs_readfile('foo2.txt','utf-8');
}

从上面的分析看到,我们还能想到一些实用的场景,比如:需要批量下载一批图片(图片数量和文件名都不确定)之后,再做批量上传,那么只需要写两个不同的then方法和两个不同的promise实例,即可用链式调用的方式完成任务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值