如何向函数回调添加额外参数
How to add extra parameters to a function callback
我正在编写的应用程序中使用一些回调。我正在使用 Mongoose 模型,需要保存几个不同的地方。 save 函数接受回调,回调的参数为 error
和 model
,但我想向回调发送函数需要的额外参数。我不确定能够执行此操作的正确语法。下面是我要做什么的一些示例代码...
var saveCallBack = function(err, model, email_address){
if(err) {
//handle error
}
else {
//use the third parameter, email_address, to do something useful
}
};
下面,token
是猫鼬模型。正如我所说,save 需要一个回调并传递错误和模型,但我还想向我的回调发送一个我在其他时候发现的变量 email_address。显然 appendParameter
函数是伪代码,但这是我需要的功能类型。
token.save(saveCallBack.appendParameter(email_address));
我正在使用绑定函数为回调附加额外参数
var customBind = function (fn, scope, args, appendArgs) {
if (arguments.length === 2) {
return function () {
return fn.apply(scope, arguments);
};
}
var method = fn,
slice = Array.prototype.slice;
return function () {
var callArgs = args || arguments;
if (appendArgs === true) {
callArgs = slice.call(arguments, 0);
callArgs = callArgs.concat(args);
} else if (typeof appendArgs == 'number') {
callArgs = slice.call(arguments, 0);
}
return method.apply(scope || window, callArgs);
};
}
这个customBind函数接受四个参数,第一个是原始回调函数,第二个是作用域,第三个是附加参数(数组),第四个是标志追加或替换。如果将最后一个参数设置为 false,则此函数中只有数组中的参数可用。
使用此功能,您可以简单地添加新参数或覆盖现有参数
var callback = customBind(saveCallBack, this, [array_of_additional_params], true)
这样所有原始参数都保留下来,您的参数将附加到最后。
如果您将其设为第一个参数,则可以使用 .bind()
。
token.save(saveCallBack.bind(null, email_address));
var saveCallBack = function(email_address, err, model){};
无论你定义了多少个参数,被调用者总是会在它的进程中传递相同的参数。
但它会更简单,只需使用一个从回调外部可见的变量。
例如:
var email = 'yourmail@mail.com';
var saveCallBack = function(err, model){
if(err) {
//handle error
}
else {
alert(email);
}
};
更新(@Jason):然后你可以使用立即调用函数表达式(IIFE)
(function(mail){
var saveCallBack = function(err, model){
if(err) {
//handle error
}
else {
alert(mail);
}
};
token.save(saveCallBack);
}, emailAddress);
我正在编写的应用程序中使用一些回调。我正在使用 Mongoose 模型,需要保存几个不同的地方。 save 函数接受回调,回调的参数为 error
和 model
,但我想向回调发送函数需要的额外参数。我不确定能够执行此操作的正确语法。下面是我要做什么的一些示例代码...
var saveCallBack = function(err, model, email_address){
if(err) {
//handle error
}
else {
//use the third parameter, email_address, to do something useful
}
};
下面,token
是猫鼬模型。正如我所说,save 需要一个回调并传递错误和模型,但我还想向我的回调发送一个我在其他时候发现的变量 email_address。显然 appendParameter
函数是伪代码,但这是我需要的功能类型。
token.save(saveCallBack.appendParameter(email_address));
我正在使用绑定函数为回调附加额外参数
var customBind = function (fn, scope, args, appendArgs) {
if (arguments.length === 2) {
return function () {
return fn.apply(scope, arguments);
};
}
var method = fn,
slice = Array.prototype.slice;
return function () {
var callArgs = args || arguments;
if (appendArgs === true) {
callArgs = slice.call(arguments, 0);
callArgs = callArgs.concat(args);
} else if (typeof appendArgs == 'number') {
callArgs = slice.call(arguments, 0);
}
return method.apply(scope || window, callArgs);
};
}
这个customBind函数接受四个参数,第一个是原始回调函数,第二个是作用域,第三个是附加参数(数组),第四个是标志追加或替换。如果将最后一个参数设置为 false,则此函数中只有数组中的参数可用。 使用此功能,您可以简单地添加新参数或覆盖现有参数
var callback = customBind(saveCallBack, this, [array_of_additional_params], true)
这样所有原始参数都保留下来,您的参数将附加到最后。
如果您将其设为第一个参数,则可以使用 .bind()
。
token.save(saveCallBack.bind(null, email_address));
var saveCallBack = function(email_address, err, model){};
无论你定义了多少个参数,被调用者总是会在它的进程中传递相同的参数。 但它会更简单,只需使用一个从回调外部可见的变量。 例如:
var email = 'yourmail@mail.com';
var saveCallBack = function(err, model){
if(err) {
//handle error
}
else {
alert(email);
}
};
更新(@Jason):然后你可以使用立即调用函数表达式(IIFE)
(function(mail){
var saveCallBack = function(err, model){
if(err) {
//handle error
}
else {
alert(mail);
}
};
token.save(saveCallBack);
}, emailAddress);