发布于 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的文件读入内存,然后将内容打印出来。

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)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务