如何向函数回调添加额外参数

Posted

技术标签:

【中文标题】如何向函数回调添加额外参数【英文标题】:How to add extra parameters to a function callback 【发布时间】:2015-08-27 08:30:36 【问题描述】:

我正在编写的应用程序中使用了一些回调。我正在使用 Mongoose 模型,需要保存几个不同的地方。保存函数接受一个回调,回调获取errormodel 作为其参数,但我想向回调发送一个函数需要的额外参数。我不确定能够做到这一点的正确语法。下面是一些我想要的示例代码......

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));

【问题讨论】:

【参考方案1】:

无论你定义了多少参数,被调用者总是会在其进程中传递相同的参数。 但它会更简单,只需使用从回调外部可见的变量即可。 例如:

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);

【讨论】:

这就是我已经在做的,但我不喜欢这种方法。我希望代码在每次调用回调时都必须显式设置它。【参考方案2】:

如果你把它作为第一个参数,你可以使用.bind()

token.save(saveCallBack.bind(null, email_address));

var saveCallBack = function(email_address, err, model);

【讨论】:

这似乎正是我所需要的。谢谢!【参考方案3】:

我正在使用绑定函数来为回调附加额外的参数

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)

这样所有原始参数都会保留,您的参数将附加到末尾。

【讨论】:

以上是关于如何向函数回调添加额外参数的主要内容,如果未能解决你的问题,请参考以下文章

向 cordova.exec 函数添加额外的参数

将额外的参数传递给回调函数

如何向 ajax 文件上传添加额外的 POST 参数?

将额外参数传递给jquery ajax promise回调[重复]

将额外参数传递给 usort 回调

如何向“will-download”事件名称/频道添加额外参数,以识别触发它的原因