2013-09-29 53 views
0

我一直在閱讀有關callBack函數,並試圖使用它。但我沒有看到它的好處。以我的代碼爲例,我沒有看到#1和#2之間的區別。相反#1顯得如此毫無意義使用回調函數vs只在函數內插入函數有什麼好處

1:

function serverConnect(callback){ 
//Connecting to server 
var xmlhttp; 
var getString; 
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
}else{// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 

var url="server/topHouses.php"; 
xmlhttp.open("POST", url, true); 
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

xmlhttp.onreadystatechange=function(){ 
    if(xmlhttp.readyState==4 && xmlhttp.status==200){ 
     //Storing response from server, an array encoded by json  
     getString = $.parseJSON(xmlhttp.responseText); 
     callback(getString); 

    } 
} 

xmlhttp.send(); 
} 

function doStuff(string){ 
//do stuff 
} 

serverConnect(doStuff); 

2:

function serverConnect(){ 
//skip skip skip 
xmlhttp.onreadystatechange=function(){ 
if(xmlhttp.readyState==4 && xmlhttp.status==200){ 
    //Storing response from server, an array encoded by json  
    getString = $.parseJSON(xmlhttp.responseText); 
    doStuff(getString); 

} 
} 

function doStuff(string){ 
//do stuff 
} 

serverConnect(); 
+1

#2沒有任何意義。 'serverConnect'不接受任何參數,但是調用正在嘗試傳入該函數。 –

+0

@Spencer對不起,這是一個錯誤,我剛纔編輯它 – user308553

+3

#2是好的,如果'serverConnect'只'doesStuff';你基本上是對回調進行硬編碼。但是如果你想在某種條件下做一些不同的事情呢?那時動態回調是有用的。 – elclanrs

回答

2

對於你的例子確實沒有多大的好處,至少從我所看到的。以下是回調方法作爲參數的用處。

myFunction(successCallback) 
{ 
    var url="server/topHouses.php"; 
    xmlhttp.open("POST", url, true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.onreadystatechange = function() { 
     if(xmlhttp.readyState==4 && xmlhttp.status==200) { 
      if(!successCallback) 
       // Some default behavior 
      else 
       successCallback($.parseJSON(xmlhttp.responseText)); 
     } 
    }; 
} 

通過允許您,或者一些其他開發人員重寫成功的行爲,它給你的應用程序具有更大的靈活性,而不犧牲以標準化的方式讓方法處理事情的便利。順便說一下,如果您使用jQuery(如您的$.parseJSON調用所示),爲什麼您使用xmlhttp而不是$.ajax

+0

是的,我正在更改我的代碼到jQuery的過程。謝謝 – user308553

1

優點是可重用性。我們來看一個簡單的例子。 #1回調可以讓你做到這一點:

function handleStatusResponse() {} 
function handleUpdateStatusResponse() {} 
function handleEmailResponse() {} 

function serverConnect (query,callback) { 

    // ajax stuff here 

    callback(data) 
} 

serverConnect('GET_STATUS',handleStatusResponse); 
serverConnect('UPDATE_STATUS',handleUpdateStatusResponse); 
serverConnect('SEND_EMAIL',handleEmailResponse); 

VS#2沒有回調這就需要你這樣做:

function handleStatusResponse() {} 
function handleUpdateStatusResponse() {} 
function handleEmailResponse() {} 

function serverConnectGetStatus (callback) { 

    // ajax stuff here 

    handleStatusResponse (data) 
} 

function serverConnectUpdateStatus (callback) { 

    // ajax stuff here 

    handleUpdateStatusResponse (data) 
} 

function serverConnectSendEmail (callback) { 

    // ajax stuff here 

    handleEmailResponse (data) 
} 

serverConnectGetStatus(); 
serverConnectUpdateStatus(); 
serverConnectSendEmail(); 

雖然這兩種方法封裝操作#2有很多重複的Ajax碼。回調是程序流程什麼函數參數是變量 - 它們允許你概括你的算法。