2011-05-18 76 views
8

我試着去使用這個jQuery腳本,這是混淆了我:解釋jQuery的AJAX成功方法

function CallService() 
     { 
       $.ajax({ 
        type  : varType, //GET or POST or PUT or DELETE verb 
        url   : varUrl, // Location of the service 
        data  : varData, //Data sent to server 
        contentType : varContentType, // content type sent to server 
        dataType : varDataType, //Expected data format from server 
        processdata : varProcessData, //True or False 
        success  : function(msg) {//On Successfull service call 
        ServiceSucceeded(msg);      
        }, 
        error: ServiceFailed// When Service call fails 
       }); 
     } 

位IM困惑是的研製成功對象。 jQuery的文件說:

success(data, textStatus, jqXHR)Function, Array 

A function to be called if the request succeeds. The function gets passed three arguments: The data returned from the server, formatted according to the dataType parameter; a string describing the status; and the jqXHR (in jQuery 1.4.x, XMLHttpRequest) object. As of jQuery 1.5, the success setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event. 

但這種方法的簽名看起來一點也不像。

success  : function(msg) {//On Successfull service call 
         ServiceSucceeded(msg);      
         } 

對象,我們似乎傳遞

問題:

1)什麼function(msg){ServiceSucceeded(msg)}是什麼意思?

2)在這種情況下'msg'是什麼?

3)我是怎麼知道如何構建成功的方法sugnature?

回答

15

完全合理的問題。 :-)在JavaScript中,您不一定必須使用盡可能多的參數來調用函數,而且您也不必定義儘可能多的參數。如果您習慣於更受限制的環境,這可能會讓您感到困惑。 :-)

接聽細節:

1)什麼是函數(MSG){ServiceSucceeded(MSG)}是什麼意思?

它定義了接受一個命名的參數(msg),並調用ServiceSucceded傳遞在於ARG一個函數(匿名之一)。 jQuery將使用jQuery文檔爲success函數定義的三個參數調用該函數,但該特定的success函數僅使用這些函數中的第一個(data)。有關命名功能與匿名功能的更多信息here

2)在這種情況下'msg'是什麼?

函數的第一個參數。 jQuery的文檔將這個第一個參數稱爲data,但您可以隨意調用它。

3)我怎麼知道如何構造成功的方法sugnature?

你做得對,它在jQuery文檔中。

關於函數參數的這個東西可能會造成混淆,所以讓我們做一些例子:

function foo(arg) { 
    alert(arg); 
} 

這是非常清楚的,我定義了一個名爲foo功能,需要一個單一命名的參數,arg。因而:

foo("Hi there"); // alerts "Hi there" 

但我也可以這樣做:

foo(); // alerts "undefined" 

在那裏,我沒有給任何參數爲foo,所以內fooarg是不確定的。

我也可以這樣做:

foo("Hi there", "again"); // alerts "Hi there" 

我打電話foo與參數,但只foo利用其中之一。

我可以定義foo爲你傳遞給使用盡可能多的參數:

function foo() { 
    var index; 

    for (index = 0; index < arguments.length; ++index) { 
     alert(arguments[index]); 
    } 
} 

arguments是一個自動的事情,所有功能都,這是一個僞陣列(這是不是一個真正的Array)實際的該函數被調用的參數。所以:

foo("Hi there", "again"); // alerts "Hi there", and then alerts "again" 

你甚至可以混合有名和無名的參數:

function foo(arg) { 
    var index; 

    alert(arg); 
    for (index = 1; index < arguments.length; ++index) { 
     alert("[" + arguments[index] + "]"); 
    } 
} 

所以現在

foo("Hi there", "again"); // alerts "Hi there" and then alerts "[again]" 

注意[]圍繞第二警報,因爲我開始與指數1循環而不是零。

arguments並命名爲ARG遊戲連接:

如果我這樣做foo("Hi");,顯示這些警報:(它走另一條路,也一樣,如果你更新arguments[0]

arg = Hi 
arguments[0] = Hi 
arg = Updated 
arguments[0] = Updated

+2

嗨TJ,你的答案真的幫助我非常感謝,我可以看到現在發生了什麼會簡單一點。 – Exitos 2011-05-18 15:35:19

+0

只是閱讀你的更新,這真的很有幫助,現在解釋很多。我從來沒有意識到JavaScript可能會「超載」?以這種方式... – Exitos 2011-05-18 15:42:06

+0

@ Pete2k:不用擔心,很高興幫助!是的,JavaScript函數是非常自由的形式,這使得它們非常強大,具有所有的優點和缺點。 ;-) – 2011-05-18 15:48:29

2
  1. 這意味着成功處理程序調用ServiceSucceeded與請求的響應。
  2. msg包含來自請求的響應。 msg映射到jQuery文檔中的data
  3. 您需要查看jQuery文檔以查找簽名。
6

該函數傳遞3個參數:datastatusjqXHR對象。 data是從AJAX調用中返回的內容,status是HTTP狀態碼(我認爲),而jqXHR是jQuery包裝的XHR對象。

在這個腳本中,他們只關心數據參數,而不關心其他兩個。

所以使用success: function(msg),他們只能得到data參數。另外兩個被髮送,但被忽略。

ServiceSucceeded只是一個函數,正在調用data參數發送給它。

success: ServiceSucceeded也可以在這裏工作。

+1

'textStatus'('status',如上面引用的那樣)不是狀態碼。如果成功,則===成功「,否則可能是」錯誤「。如果您只能指定成功/錯誤功能,請不要問我的觀點是什麼。 – Sinjai 2017-08-24 15:51:07

1

1)如果AJAX請求成功,則調用該函數,即成功狀態碼由被聯繫的服務器返回。

2)我會假設'味精'是從服務器返回的數據。另外兩個參數未提供,因此未使用。

3)使用Jquery文檔,並擺弄,直到你得到你想要的。

1
  1. 這是一個匿名函數
    這就像一個常規功能,但沒有名稱。

  2. msg是函數的第一個參數。

  3. 通過閱讀文檔。

1

即使成功函數被定義爲接受三個參數(按照您引用的文檔),那三個參數ar e不是強制性的 - Javascript對這種事情非常寬容;如果你錯過了函數調用的參數,它只會被設置爲underfined,所以只要你不嘗試使用它,JS就不會拋出任何錯誤。

您提供的代碼只給出一個參數 - msg - 但在JS中,這是完全有效的;這意味着msg將是文檔中定義的data參數,並且textStatusjqXHR將是未定義的。

這很好,只要在你的成功函數中你實際上不想使用這些參數。如果你想使用它們,然後通過它們,但如果沒有,可以放棄它們。您正在編寫成功函數,因此您可以決定使用三個參數中的哪一個。

1

jquery Ajax是一種讓你與服務器通信的方式(PHP,ASP,無論)。假設您使用PHP。函數「callService()」向「varUrl」(validation.php,即)發送請求並獲取(或POST - > varType)內容(varContentType - > valdation.php?id = 1231 & whatever = soemthing)。這樣做的目的是在不重新加載頁面的情況下獲得一些服務器端數據。如果你想validation.php爲echo一些html,那麼Ajax函數中的dataType必須是「html」。有關dataType的更多信息,請參閱jquery.com。

成功參數是服務器響應的函數處理函數。如果從服務器獲得與所詢問的數據類型(html,json,text,whatever)對應的響應,則調用成功。在這種情況下,如果服務器響應正確,則使用屬性「msg」調用函數「ServiceSucceeded」,這是您請求的服務器響應。