JavaScript回调函数和参数[重复项]

问题描述 投票:13回答:3

我想要类似的东西:

function AjaxService()
{

 this.Remove = function (id, call_back)
 {
    myWebService.Remove(id, CallBack)
 }

 function CallBack(res) {
        call_back(res);
    }  
}

所以我的调用程序将像这样:

var xx  = new AjaxService();
xx.Remove(1,success);

function success(res)
{


}

此外,如果我想为成功函数添加更多参数,我将如何实现它。假设我有这样的成功功能:

var xx  = new AjaxService();
//how to call back success function with these parameters
//xx.Remove(1,success(22,33));

function success(res,val1, val2)
{


}

将不胜感激。

javascript callback dom-events
3个回答
23
投票

使用闭包和函数工厂:

function generateSuccess (var1,var2) {
    return function (res) {
        // use res, var1 and var2 in here
    }
}
xx.Remove(1,generateSuccess(val1,val2));

您在这里传递的不是generateSuccess函数,而是generateSuccess返回的匿名函数,看起来像Remove期望的回调。 val1val2传递到generateSuccess中,并由返回的匿名函数中的闭包捕获。

更清楚地说,这是正在发生的事情:

function generateSuccess (var1,var2) {
    return function (res) {
        // use res, var1 and var2 in here
    }
}
var success = generateSuccess(val1,val2);
xx.Remove(1,success);

或者,如果您更喜欢内联:

xx.Remove(1,(function(var1,var2) {
    return function (res) {
        // this is your success function
    }
})(val1,val2));

可读性差,但使您不必命名工厂功能。如果您不是循环执行此操作,那么Xinus的解决方案也将比我的内联版本更好,更简单。但是请注意,在循环中,您需要双重关闭机制来断开传递给回调函数的变量与当前作用域中的变量的连接。


8
投票

您可以将其作为匿名函数指针传递

xx.Remove(1,function(){
                           //function call will go here
                           success(res,val1, val2);
                      });

0
投票

一种方法:

function AjaxService {
    var args_to_cb = [];
    this.Remove = function (id, call_back, args_to_callback_as_array) {
        if( args_to_callback_as_array!=undefined )
            args_to_cb = args_to_callback_as_array;
        else 
            args_to_cb = [];
        myWebService.Remove(id, CallBack)
    }

    function CallBack(res) {
       setTimeout( function(){ call_back(res, args_to_cb); }, 0 );
    }  
}

所以您可以这样使用它:

var service = new AjaxService();
service.Remove(1,success, [22,33]);

function success(res,val1, val2)
{
    alert("result = "+res);
    alert("values are "+val1+" and "+val2);
}

我通常使用setTimeout执行回调。这样,您的回调将在有时间执行。您的代码将同时继续执行,例如:

var service = new AjaxService();
service.remove(1, function(){ alert('done'); }); // alert#1
alert('called service.remove'); // alert#2

您的回调将在警报#2之后执行。

当然,对于您的应用程序,由于ajax回调本身是异步的,因此它将自动发生。因此,在您的应用程序中,最好不要这样做。

干杯!jrh

© www.soinside.com 2019 - 2024. All rights reserved.