promiseオブジェクトに基づく2つのクラスライブラリqライブラリとbluebirdベース呼び出しと原理
2871 ワード
前節ではpromiseの原理と実現について述べましたが、この節ではpromiseパッケージに基づく2つのライブラリをお届けします.プロジェクトの実戦でpromiseを採用して非同期を処理するのに便利です.
一、qライブラリwww.nodejs.com/pageage/q
インストール:npm install q--save
1.Qのallメソッドは、Promise.allメソッドと同様に、複数の非同期リクエストの結果を待機し、操作を行う
2.Qのfcallメソッドは、同期された関数を成功したpromiseオブジェクトに変換し、thenメソッドの呼び出しをサポートし、同期関数の戻り値をthenの成功したコールバックにパラメータとして入力することができる.Promiseオブジェクトのresolveメソッドとは異なります.Promiseのresolveメソッドは、成功したpromiseオブジェクトを生成する方法でもありますが、確かにresolveのパラメータをpromiseオブジェクトの成功したコールバックに成功したコールバックパラメータとして入力します.
3.deferオブジェクトとpromiseのdefer処理方式と呼び出し方式は同じである.
二、bluebird
上のqライブラリは主に既存のpromiseメソッドをパッケージ化し改造し、bluebirdライブラリは主にpromiseの既存の機能を拡張し、主にpromisifyとpromisifyAllの2つのメソッドを追加し、非同期メソッドpromise化することができる.
npm intall bluebird--saveのインストール
1、promisify非同期方法promise化
promisifyの実現原理は,高次関数を用いて1つの関数の特性を返し,promiseインスタンスのパッケージを完成させることである.
2.promisifyAllは、1つのオブジェクトの上のすべてのメソッドをpromise化し、属性名「既存メソッド」+「Async」というメソッドを生成し、非同期メソッドをサポートすることができる.
実現原理:
ここではqライブラリとbluebirdライブラリの従来のprimiseに対する改造とアップグレードを紹介し、開発中に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を利用して非同期処理を完了することをより便利にしました.