javascript回调函数和参数

时间:2010-01-04 04:37:57

标签: javascript javascript-events callback

我想要类似的东西。

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


}

帮助将会受到欢迎。

此致 成员Parminder

3 个答案:

答案 0 :(得分:22)

使用闭包和函数工厂:

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的解决方案也会比我的内联版本更好更简单。但请注意,在循环中,您需要双闭包机制来断开传递回调函数的变量与当前作用域中的变量。

答案 1 :(得分:8)

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

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

答案 2 :(得分: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

相关问题