节点 Js 将参数传递给"off the shelf"回调



我有一个库,它发出 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); 
});

这样,您可以将任意参数添加到传递的数据对象上。

相关内容

最新更新