nodejs関数promise化

2353 ワード

一.概念
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) 
})