使用Function.prototype.bind与参数数组?

17 浏览
0 Comments

使用Function.prototype.bind与参数数组?

如何使用参数数组调用Function.prototype.bind,而不是硬编码的参数?(不使用ECMA6,所以没有展开运算符)。我正在尝试在使用回调的模块周围放置一个promise包装器,并且我希望绑定传递给我的包装器方法的所有参数并将它们绑定。然后,我想使用自己的回调来调用部分应用的绑定函数,该函数将解决或拒绝一个promise。

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) { ... })

但这两种方法都感觉不太好。有什么想法吗?

0