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实例,即可用链式挪用的体式格局完成任务。

    原文作者:pitfall
    原文地址: https://segmentfault.com/a/1190000004159962
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞