Как я могу вызвать 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) { ... })
Но оба этих метода чувствуют себя грязными. Любые идеи?