如何在函数回调中添加额外的参数

时间:2015-06-11 14:53:55

标签: javascript node.js callback mongoose

我在我正在编写的应用程序中使用了一些回调。我使用的是Mongoose模型,需要保存一些不同的地方。 save函数接受回调,回调得到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));

3 个答案:

答案 0 :(得分:2)

如果您改为使用第一个参数,则可以使用.bind()

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

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

答案 1 :(得分:1)

我使用bind函数为回调附加附加参数

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函数接受四个参数,第一个是原始回调函数,第二个是范围,第三个是附加参数(数组),第四个是flag append或replace。如果将last参数设置为false,则此函数中只有数组中的参数可用。 使用此功能,您可以简单地添加新参数或覆盖现有参数

var callback = customBind(saveCallBack, this, [array_of_additional_params], true)

以这种方式保留所有原始参数,并将参数附加到末尾。

答案 2 :(得分:0)

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

var email = 'yourmail@mail.com';

var saveCallBack = function(err, model){
    if(err) {
        //handle error
    }

    else {
        alert(email);
    }
};

更新(@Jason):然后你可以使用Immediately-Invoked Function Expression(IIFE)

   (function(mail){
        var saveCallBack = function(err, model){
            if(err) {
                //handle error
            }

            else {
                alert(mail);
            }
        };
        token.save(saveCallBack);
    }, emailAddress);