nodejs関数promise化
2353 ワード
一.概念
calback関数を持って新たにpromiseに変えて実現することです.
二.使用
bluebirdのようなpromiseライブラリを導入して、そのpromisifyとpromisifyallの方法を利用する必要があります.
1.promisify方法
nodeCallback(エラー優先のコールバック)コールバック関数がpromise(nodejs標準バッグの非同期コールバックが必要です.ほとんどnodeCallbackです.)
一つのライブラリのすべての方法をpromiseに変換して実現し、元の関数名にAyncを追加します.
1.単一の関数はpromiseパッケージです.
変換が必要な関数を一つの方法として導入しました.異なる関数によって受けるパラメータが異なりますので、methods.appy()を使用する必要があります.
calback関数を持って新たにpromiseに変えて実現することです.
二.使用
bluebirdのようなpromiseライブラリを導入して、そのpromisifyとpromisifyallの方法を利用する必要があります.
1.promisify方法
nodeCallback(エラー優先のコールバック)コールバック関数がpromise(nodejs標準バッグの非同期コールバックが必要です.ほとんどnodeCallbackです.)
var Promise = require('bluebird')
var fs = require('fs')
//
fs.readFile('./test.js',function(err, data){
console.log(data)
})
// promisify
const readFileAsync = Promise.promisify(fs.readFile)
readFileAsync('./test.js').then(function(data){
console.log(data)
}).catch(e){
console.log(e)
}
2.promisifyall方法一つのライブラリのすべての方法をpromiseに変換して実現し、元の関数名にAyncを追加します.
var Promise = require('bluebird')
// promisifyall
const fs = Promise.promisifyall(require('fs'))
fs.readFileAsync('./test.js').then(function(data){
console.log(data)
}).catch(e){
console.log(e)
}
三.自分のpromisifyを実現する1.単一の関数はpromiseパッケージです.
// fs promise
// promise ,
var promisify = function(fpath, encoding){
return new Promise(function(resolve, reject){
fs.readFile(fpath, encoding, function(err, result){
if(err) return reject(err)
else return resolve(result)
})
})
}
2.関数の一般化変換が必要な関数を一つの方法として導入しました.異なる関数によって受けるパラメータが異なりますので、methods.appy()を使用する必要があります.
var promisify = function (method, ctx) {
return function () {
// method
var args = Array.prototype.slice.call(arguments, 0);
// use runtime this if ctx not provided
ctx = ctx || this;
// Promise
return new Promise(function (resolve, reject) {
// callback
var callback = function () {
return function (err, result) {
if (err) {
return reject(err);
}
return resolve(result);
};
}
args.push(callback());
// method
method.apply(ctx, args);
});
};
};
//
var readFileAsync = promisify(fs.readFile)
readFileAsync('./test.txt', 'utf8').then(function(data){
console.log(data)
})