Q实现promise的常用方法有7个,在不同情况下使用不同的方法,主要分为数据封装,同步封装和异步封装。
var Q = require('q');
var fs = require('fs');
var colors = require('colors');
//将数据封装成promise
//特点:封装一个数据,调用then直接得到该数据
Q('hello,world').then(function (data) {
console.log(data); //-->hello,world
});
//Q.fcall
//将同步方法封装成promise
//特点:传递一个function,返回一个promise,调用then得到方法的返回值
Q.fcall(function(){
return 123;
}).then(function(data){
console.log(data); //--> 123
});
(1)Q.nfcall()
//定义两个参数供下面方法用
var filename = '../public/test.xml';
var encoding = 'utf-8';
//Q.nfcall:
//将异步方法封装成promise
//特点:封闭时就得传递调用方法的参数,直接得到promise
Q.nfcall(fs.readFile,filename,encoding).then(function (data) {
console.log(data); //-->xml内容就不明说了,就这样的格式就对了
});
(2)Q.denodeify()
//Q.denodeify:
//将异步方法封装成promise
//特点:封装后返回一个方法,调用此方法得到promise
var File_denodeify = Q.denodeify(fs.readFile);
File_denodeify(filename,encoding).then(function(result){
console.log(result.green)
},function(err){
console.log(err.toString().red);
}
);
(3)Q.defer
//Q.defer:使用最多
//手动封装一个promise
//特点:使用deferd对象的reject方法(失败回调)、resolve方法(成功回调)、promise属性来实现自定义promise。
//(前面2个nfcal、denodeify底层应该也是用deferd实现的)
var File_deferd = function(filename,encoding){
var deferred = Q.defer();
fs.readFile(filename,encoding,function(err,result){
if(err){
deferred.reject(err.toString().red);
}
deferred.resolve(result);
});
return deferred.promise;
};
//标准的then(onFulfilled,onRejected);
//File_deferd(filename).then(function(result){
// console.log(result.toString().blue);
// },function(err){
// console.log(err.toString().red);
// }
//);
//用catch()捕获错误
File_deferd(filename).then(function(result){
console.log(result.toString().blue);
}).catch(function (err) {
console.error(err);
});
(4)Q.makeNodeResolver()
//Q.makeNodeResolver:
//手动封装一个promise
//特点:和第deferd原理差不多,只不过用了deferd自带的方法省掉了我们手动实现reject方法、resolve方法
var File_makeNodeResolver = function(filename,encoding){
var deferred = Q.defer();
fs.readFile(filename,encoding,deferred.makeNodeResolver());
return deferred.promise;
};
File_makeNodeResolver(filename,encoding).then(function(result){
console.log(result.green);
},function(err){
console.log(err.toString().red);
});
(5)Q.all()
//Q.all
//将一批promise封装成一个promise
//特点:可以并行执行一批promise,全部执行完毕后一起返回,得到的结果是一个数组
Q.all([promise1,promise2,promise3]).then();