发布于 2015-12-19 05:57:35 | 133 次阅读 | 评论: 0 | 来源: PHPERZ
Q.js CSS 选择器
Q.js是一个CSS 选择器和Sizzle的兼容.
世界上最远的距离不是生与死的距离,而是文档就在你面前,你依然不知道这个库怎么用。
鄙人IQ不高,已经被Q.js虐了几天。查看了github上kriskowal/q的文档,现在把几种看明白了的使用方法整理记录下来,以下几种方法可以把nodejs中包含callback回调的函数转化为promise风格的代码:
Q.nfcall
Q.nfapply
Q.defer
Q.denodeify
首先设定一个使用场景:预期将一个名叫foo.txt的文件读入内存,然后将内容打印出来。
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)
}
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来实现的代码如下:
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);
以上三种方法,都存在一个麻烦的问题:如果我的需求场景变成了首先读入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实例,即可用链式调用的方式完成任务。