promiseオブジェクトに基づく2つのクラスライブラリqライブラリとbluebirdベース呼び出しと原理

2871 ワード

前節ではpromiseの原理と実現について述べましたが、この節ではpromiseパッケージに基づく2つのライブラリをお届けします.プロジェクトの実戦でpromiseを採用して非同期を処理するのに便利です.
一、qライブラリwww.nodejs.com/pageage/q
インストール:npm install q--save

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処理方式と呼び出し方式は同じである.
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)});

二、bluebird
上のqライブラリは主に既存のpromiseメソッドをパッケージ化し改造し、bluebirdライブラリは主にpromiseの既存の機能を拡張し、主にpromisifyとpromisifyAllの2つのメソッドを追加し、非同期メソッドpromise化することができる.
npm intall bluebird--saveのインストール
1、promisify非同期方法promise化
let blueBird = require('bluebird');
let read = blueBird.promisify(fs.readFile);
read('./2.txt','utf8').then(res=>{console.log(res)});

promisifyの実現原理は,高次関数を用いて1つの関数の特性を返し,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は、1つのオブジェクトの上のすべてのメソッドを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を利用して非同期処理を完了することをより便利にしました.