Promise周辺の方法
5085 ワード
上でプロミスを知ったら、この文章はプロミスの周辺方法を拡張します.
promisifyの実現
promisifyはnodeが提供する方法です.リフレクトネスト問題を解決するために、使いやすいです.私のプロジェクトには二つのファイルがあります.一つはname.txtで、中にはage.txtがあります.もう一つはage.txtの中の内容は18です.ここでは複数の非同期受信リターン値の問題をデモするために、ここでは元の非同期リターン値を確認してみます.
非同期の呼び出し
read共通方法のパッケージ
promisify使用
上の使い方は簡単です.簡単に実現しましょう.使い方は以上と同じです.
プロミゼ.all方法は、行列に入ってきました.最後に順番に1つの配列に戻ります.もし配列の中の一つが失敗したら、失敗状態の使い方です.
使い方:
catchとは成功パラメータがないthenで、前の記事にパッケージされたPromiseにcatch関数を追加します.
成功しても失敗しても実行され、一つのpromiseを返してthenに呼び戻すのもthenのもう一つの実行形態の使い方です.
finally(calback){
使い方:
promisifyの実現
promisifyはnodeが提供する方法です.リフレクトネスト問題を解決するために、使いやすいです.私のプロジェクトには二つのファイルがあります.一つはname.txtで、中にはage.txtがあります.もう一つはage.txtの中の内容は18です.ここでは複数の非同期受信リターン値の問題をデモするために、ここでは元の非同期リターン値を確認してみます.
非同期の呼び出し
let fs= require('fs');
fs.readFile('./name.txt', 'utf8', function (err, data) {
console.log(data);//age.txt
if (err) {
console.log(err);
} else {
fs.readFile(data, 'utf8', function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
}
})
}
});
彼の気持ちの悪いところを見た以上、私達は何とかして最適化して、公共関数をカプセル化します.read共通方法のパッケージ
function read(...args) {
let dfd = Promise.defer();// promise
fs.readFile(...args, function (err, data) {
if (err) dfd.reject(err);
dfd.resolve(data)
});
return dfd.promise
}
使う時は以下の通りです.read('./name.txt', 'utf8').then(data => {
console.log(data);
return read(data, 'utf8')
}).then(data => {
console.log(data);
})
上のこのようなはよさそうですが、やはり人を満足させることができません.彼の機能は単一すぎるので、この時に私達の主役のpromisifyが登場します.それではまず見てみます.promisify使用
let {promisify} = require('util');//node
let readFile = promisify(fs.readFile); // ,
readFile('./name.txt', 'utf8').then(data => {
console.log(data);//age.txt
return readFile(data, 'utf8')
}).then(data => {
console.log(data);//18
})
promisify実現上の使い方は簡単です.簡単に実現しましょう.使い方は以上と同じです.
function promisify(fn) {// fs.readFile/fs.writeFile...
return function (...args) {// ,
// then promise
return new Promise((resolve, reject) => {
fn(...args,function (err,data) {
if(err) reject(err)
resolve(data)
})
})
}
}
promise.all実現プロミゼ.all方法は、行列に入ってきました.最後に順番に1つの配列に戻ります.もし配列の中の一つが失敗したら、失敗状態の使い方です.
Promise.all([1, readFile('./name.txt', 'utf8'), 2, readFile('./age.txt', 'utf8'), 3]).then(data => {
console.log(data); //[1,'age.txt'(name ),2,'18'(age ),3]
});
実装:// promise, true, false
function isPromise(x) {
if((typeof x==='object'&&x!=null)||typeof x ==='function'){
if(typeof x.then ==='function'){
return true
}
}
return false
}
Promise.all = function (arr) {
// promise
return new Promise((resolve, reject) => {
let ary = [];
//
let idx=0;
let insertAry=(value,index)=>{
ary[index]=value;
if(++idx===arr.length){
resolve(ary)
}
};
//
for (let i = 0; i < arr.length; i++) {
let currentValue = arr[i];
if (isPromise(currentValue)) {
// promise
currentValue.then(y=>{
insertAry(y,i)
},reject)
} else {
//
insertAry(currentValue,i)
}
}
})
};
promise.reloveとpromise.rejectを直接呼び出します.使い方:
Promise.resolve(1).then(data=>{console.log(data)})
実装:Promise.resolve=function(value){
return new Promise((resolve,reject)=>{
resolve(value)
})
};
catchcatchとは成功パラメータがないthenで、前の記事にパッケージされたPromiseにcatch関数を追加します.
catch(fn){//catch
return this.then(null,fn)// promise
}
promise中のfinally成功しても失敗しても実行され、一つのpromiseを返してthenに呼び戻すのもthenのもう一つの実行形態の使い方です.
Promise.resolve(readFile('./name.txt','utf8')).then(data=>{
// console.log(data);
return data
}).catch(err=>{
console.log(err);
}).finally(data=>{
console.log('finally');
}).then(data=>{
console.log(data);
});
実現:上記パッケージのpromiseに以下の方法を追加します.finally(calback){
return this.then(
res => Promise.resolve(callback()).then(() => res),
err => Promise.resolve(callback()).then(() => { throw err; })
)
}
プロモーション中のrace使い方:
Promise.race([readFile('./name.txt','utf8'),readFile('./age.txt','utf8')]).then(data=>{
console.log(data);
});
実装:Promise.race=function (arr) {
return new Promise((resolve,reject)=>{
for (let i = 0; i < arr.length; i++) {
let currentValue=arr[i];
// isPromise promise.all
if(isPromise(currentValue)){
currentValue.then(data=>{
resolve(data)
},reject)
}else {
resolve(currentValue)
}
}
})
};