nodejs promise之Q模組
阿新 • • 發佈:2019-01-23
Q實現promise的常用方法有7個,在不同情況下使用不同的方法,主要分為資料封裝,同步封裝和非同步封裝。
1,將資料封裝成promise。
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
});
2,將同步方法封裝成promise---------Q.fcall()
//Q.fcall
//將同步方法封裝成promise
//特點:傳遞一個function,返回一個promise,呼叫then得到方法的返回值
Q.fcall(function(){
return 123;
}).then(function(data){
console.log(data); //--> 123
});
3,將非同步方法封裝成promise--------
(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();