基於promise對象的兩種類庫q庫和bluebird基礎調用和原理

上一節講述了promise的原理及實現,這一節爲你們帶來兩個基於promise封裝的庫,方便咱們在項目實戰中可以方便採用promise處理異步。node

1、q庫 www.nodejs.com/pageage/qnpm

安裝: npm install q --savepromise

let Q = require('q');
let p = new Promise(function(resolve,reject){
    resolve('hello,promise')
})

1.Q的all方法 和Promise.all方法同樣,都是等待多個異步請求結果,在作出操做異步

Q.all([p,p,p]).then(([a,b,c])=>{console.log(a,b,c)});
Promise.all([p,p,p]).then(([a,b,c])=>{console.log(a,b,c)})

2.Q的fcall方法,將一個同步的函數,轉換爲一個成功的promise對象,支持調用then方法,而且能夠把同步函數的返回值,傳入then的成功回調中做爲參數。
它和Promise對象的resolve方法,不太同樣。Promise的resolve方法,也是生成一個成功的promise對象,可是確是將resolve的參數傳入promise對象成功回調中做爲成功回調參數。函數

Q.fcall(function(){return '123'}).then(res=>{console.log(res)});
Promise.resolve(function(){return '123'}).then(res=>{console.log(res)})

3.defer對象 和 promise的defer處理方式和調用方式相同。ui

let fs = require('fs');
function readFile(path){
    let defer = Q.defer();
    fs.readFile(path,'utf8',function(err,data){
        err?defer.reject(err): defer.resolve(data);
    })
    return defer.promise;
}
readFile('./1.txt').then(res=>{console.log(res)});

2、bluebirdcode

上面q庫 主要是對原有promise方法 進行了封裝和改造,bluebird庫 主要是對promise原有功能進行了擴展,
主要是添加了 promisify和promisifyAll兩個方法,能夠將異步方法promise化。對象

安裝 npm intall bluebird --save開發

一、promisify 將一個異步方法promise化同步

let blueBird = require('bluebird');
let read = blueBird.promisify(fs.readFile);
read('./2.txt','utf8').then(res=>{console.log(res)});

promisify 的實現原理,就是利用高階函數返回一個函數的特性,完成一個promise實例的封裝

function myPrimisify (fn){
    return function (...args){
       return new Promise(function(resolve,reject){
                fn(...args,function(err,data){
                    err?reject(err):resolve(data)
                })
        })
    }
}
let read2 = myPrimisify(fs.readFile);
read2('./2.txt','utf8').then(res=>{console.log(res)});

2.promisifyAll 將一個對象上面全部的方法,都promise化,生成一個屬性名爲‘原有方法’+‘Async’的方法,均可以支持異步方法.

blueBird.promisifyAll(fs);
fs.readFileAsync('./2.txt','utf8').then(res=>{console.log(res)});

實現原理:

function myPromisifyAll(obj){
    Object.keys(obj).forEach((item,index)=>{
        if(typeof obj[item]=='function')
        obj[item+'Async']  =myPrimisify(obj[item])
    })
}
myPromisifyAll(fs);
fs.readFileAsync('./2.txt','utf8').then(res=>{console.log(res)});

這裏介紹了q庫和bluebird庫對原有primise的改造和升級,更加方便咱們在開發過程當中利用promise完成異步處理。

相關文章
相關標籤/搜索