2010-01-04 101 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