ハードコードされた引数ではなく、引数の配列を使用して Function.prototype.bind を呼び出すにはどうすればよいですか? (ECMA6 を使用していないため、スプレッド オペレーターはありません)。
コールバックを使用するモジュールの周りに promises ラッパーを配置しようとしています。ラッパー メソッドに渡されたすべての引数をバインドし、それらをバインドしたいと考えています。次に、プロミスを解決または拒否する独自のコールバックを使用して、部分的に適用されたバインドされた関数を呼び出したいと考えています。
var find = function() {
var deferred, bound;
deferred = Q.defer();
bound = db.find.bind(null, arguments);
bound(function(err, docs) {
if(err) {
deferred.fail(err);
} else {
deferred.resolve(docs);
}
});
return deferred.promise;
}
しかし、 bind は引数の配列ではなく引数を期待しているため、明らかにこれは機能しません。引数配列の末尾にコールバックを挿入し、apply を使用することで、これを実行できることがわかっています。
arguments[arguments.length] = function(err, docs) { ... }
db.find.apply(null, arguments);
または、引数配列を反復処理し、各引数の関数を再バインドします。
var bound, context;
for(var i = 0; i < arguments.length; i++) {
context = bound ? bound : db.find;
bound = context.bind(null, arguments[i]);
}
bound(function(err, docs) { ... })
しかし、これらの方法はどちらも汚いと感じます。何か案は?