2011-10-07 81 views
4

我知道它的工作原理。我已成功實施它。你能解釋爲什麼這個jQuery代碼有效嗎?

$("#vehicle_application_product_id").autocomplete({ 
     minLength: 2, 
     source: function(request, response) { 
      var term = request.term; 
      if (term in cache) { 
       response(cache[term]); 
       return; 
      } 

      lastXhr = $.getJSON("/products/get_json_list", request, function(data, status, xhr) { 
       cache[term] = data; 
       if (xhr === lastXhr) { 
        response(data); 
       } 
      }); 
     } 
    }); 

我很喜歡用一些這方面的東西的腳本小子。我將永遠無法編寫匿名函數自己,因爲以下原因:

1)這個人是怎麼知道把參數「請求」,並在規範「反應」?

2)開頭的行 「lastXhr =」 真的是神祕。最後還有另一個匿名函數。我意識到這可能是一個回調,這是在請求發送到指定的URL後執行的。

3)在匿名函數最後條件:

if (xhr === lastXhr) {                      
    response(data); 
} 

到底是什麼呢?如果那麼來自這個匿名塊的第三個參數xhr等於由.getJSON調用ENCOMPASSING這個匿名塊返回的值,返回響應中的數據?

這真的是最困難的部分,以繞到我的頭。我注意到這是3個等號。這看起來像非常高級的代碼概念,我只是明白這背後的理由是爲了讓我可以成爲一個更好的編碼器。

回答

4
  1. 參數requestresponse將被傳遞到分配給source選項爲documented here的功能。從本質上講,插件承諾將這兩個參數傳遞給回調函數,這就是你表明你想要獲得它們的信號。

  2. 該函數是一個回調計劃在請求完成時調用,而不是簡單發送之後調用。此外,在調用時getJSON,代碼分配所得到的對象到lastXhr變量,以便它記住哪些是它的最後一次請求。

  3. 在回調中,您引用了以參數xhr的形式完成的請求。所以if等於寫作:

    if (the request that completed is the last request made) { 
        // ... 
    } 
    

    爲什麼這樣做?爲確保您不會對請求的結果採取行動,如果由於響應時間過長而導致用戶輸入速度過快,您有多個未完成的請求。在這種情況下,除了最後一個的結果之外,你真的不感興趣。

    回調如何從外部範圍訪問變量lastXhr?這是由於closure

  4. 這三個等號是什麼?這是identity operator

3

1)他們閱讀了jQuery UI自動完成插件這裏的文檔: http://jqueryui.com/demos/autocomplete/#option-source

2)lastXhr看到的用法類似於針對的getJSON所示jQuery的文檔頁面的那些:http://api.jquery.com/jQuery.getJSON/

3)編寫代碼的人可能希望jQuery自動完成,以僅顯示最近$.getJSON()請求自動完成數據的結果。例如,假設我輸入「abc」和自動完成的消息,但是之後輸入「d」,所以它現在是「abcd」 - 然後另一個自動完成消息被激發。我們只關心「abcd」的結果,對吧?所以這個檢查lastXhr匹配目前的xhr那樣做!

注意===在JavaScript正在測試的這些對象是同一類型的,並且是相等的。在JS中,1 == '1'爲真,但1 === '1'不是。我強烈推薦「JavaScript:好的部分」,它涉及了關閉語言和其他有趣方面的概念。

+0

我會接受你的建議,在該書Cymen。 – AKWF

相關問題