2010-01-04 96 views
13

我想要类似这样的东西。javascript回调函数和参数

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


} 

另外,如果我想更多的参数,我将如何achive它添加到成功的功能。 说,如果我有这样的

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

function success(res,val1, val2) 
{ 


} 

帮助成功的功能将被appretiated。

问候 成员Parminder

回答

22

使用闭包和函数工厂:

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

什么你路过此地不是generateSuccess函数,但由generateSuccess返回的匿名函数看起来像预期的回调函数。 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 2010-01-04 04:58:02

+0

没有工作 谢谢 – Parminder 2010-01-04 05:21:04

+0

@parminder你确定它不工作?这是将参数传递给不接受参数的标准方法,例如将参数传递给'setTimeout'。有没有你可能错过了语法的东西? – slebetman 2010-01-04 06:16:48

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 2010-01-04 04:54:21

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

+0

在CallBack函数引用call_back不存在 它将如何被调用。 – Parminder 2010-01-04 05:27:12

+1

JS倾向于不使用这样的模式;通常任何其他状态都封装在封闭中。 – 2010-01-04 06:34:38