JavaScript回调函数和参数

13

我想要类似于这样的东西:

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


}

需要帮助,不胜感激。

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的解决方案也可以,比我的内联版本更简单。但请注意,在循环中需要双重闭包机制,以使传递到回调函数中的变量与当前范围中的变量分离。


2
在 JavaScript 中,难道没有更简单的方法来做这件事吗? - jrharshath
@parminder 你确定它不起作用吗?这是将参数传递给不接受参数的回调函数的标准方法,例如将参数传递给 setTimeout。你可能错过了语法中的某些东西吗? - slebetman
2
@harshath.jr 这并不复杂。这是相当标准的JavaScript。 - Justin Johnson

8
您可以将其作为匿名函数指针传递。
xx.Remove(1,function(){
                           //function call will go here
                           success(res,val1, val2);
                      });

7
应该是:xx.Remove(1, function(res){success(res, val1, val2)}); - slebetman

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

你的回调函数将在第二个警报后执行。

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

祝好!
jrh


在回调函数中引用call_back不存在,它将如何被调用? - Parminder
1
JS通常不使用这样的模式;通常任何其他状态都会被包装在闭包中。 - Ben Zotto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接