我有一个库,它发出 Web 请求并将结果传递给回调,如以下示例所示:
someReadyWebSearchThirdPartyLibrary.getSearch(parameters, error, callback);
然后回调是这样的:
var callback = function (data) {
console.log(data);
};
有没有办法将更多参数传递给调用方的回调,因为这是一个现成的现成库?
只需内联定义"first"回调,在那里您可以传递更多参数:
someReadyWebSearchThirdPartyLibrary.getSearch(parameters, error, function(data) {
callback(data, otherVar1, otherVar2);
});
然后,您的回调可能如下所示:
var callback = function (data, otherVar1, otherVar2) {
console.log(data);
console.log(otherVar1);
console.log(otherVar2);
};
如果不编辑调用回调的库的代码,则无法更改传递给该特定回调的内容。 但是,有多个选项可以访问其他变量:
内联回调访问作用域中的变量
可以使用范围和内联定义使其他变量可用于回调(通过范围(。
let someVar1 = "foo";
let someVar2 = 4;
someReadyWebSearchThirdPartyLibrary.getSearch(parameters, error, function(data) {
// can access data, someVar1 and someVar2 here as they are all in scope
console.log(someVar1);
});
使用.bind()
向回调添加参数
您还可以使用.bind()
创建一个添加参数的新函数。
function callback(someVar1, someVar2, data) {
console.log(someVar1);
}
someReadyWebSearchThirdPartyLibrary.getSearch(parameters, error, callback.bind(null, "foo", 4));
.bind()
创建一个新函数,该函数在调用实际的callback()
函数之前添加其他参数。
创建自己的存根函数
或者,创建自己的存根函数来调用您的回调(本质上是.bind()
选项为您所做的(:
function mycallback(someVar1, someVar2, data) {
console.log(someVar1);
}
someReadyWebSearchThirdPartyLibrary.getSearch(parameters, error, function(data) {
mycallback("foo", 4, data);
});
我假设您的回调参数是可变的,并且该函数是以隔离方式定义的(它无法访问自身以外的范围,并且您不想改变回调函数的基础数据。 它还假设数据是一个对象(不过你应该对此执行一些验证(。因此,您可以执行以下操作:
someReadyWebSearchThirdPartyLibrary.getSearch(parameters, error, function(data) {
data.newArgument = 'lorem';
callback(data);
});
这样,您可以将任意参数添加到传递的数据对象上。