使用Function.prototype.bind与参数数组?
使用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) { ... })
但这两种方法都感觉不太好。有什么想法吗?