##はじめに
ES6のPromise
を使ってdenodeify()
を実装してみた。Q.jsのdenodeify()の実装を参考にした。
nodeの非同期処理関数を簡単にPromiseオブジェクトに変換できる。
##動機
非同期処理はQ.jsを今まで使っていたけど、nw.jsでは普通にPromiseが使える。なのでQ.jsは不要になるのだけれども、非同期コールバックをラップするdenodeify()
がないとつらいので、同じ機能を持つ関数を作ろうと思った。
##実装
function denodeify(nodeFunc){
var baseArgs = Array.prototype.slice.call(arguments, 1);
return function() {
var nodeArgs = baseArgs.concat(Array.prototype.slice.call(arguments));
return new Promise((resolve, reject) => {
nodeArgs.push((error, data) => {
if (error) {
reject(error);
} else if (arguments.length > 2) {
resolve(Array.prototype.slice.call(arguments, 1));
} else {
resolve(data);
}
});
nodeFunc.apply(null, nodeArgs);
});
}
}
##使い方
var fs = require('fs');
var readFile = denodeify(fs.readFile);
readFile('file.txt')
.then((data) => {
// ToDo
})
.catch ((err) => {
// エラー処理
});
##終わりに
投稿した後で記事をチェックしてたら、同じ目的でコードもほとんど同じものがすでに載っていましたな。。偶然の一致だ。。
コールバックベースの関数をプロミスオブジェクトに変換する