世界上最远的间隔不是生与死的间隔,而是文档就在你眼前,你依旧不知道这个库怎样用。
鄙人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实例,即可用链式挪用的体式格局完成任务。