1. 程式人生 > >nodejs promise之Q模組

nodejs promise之Q模組

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();