2013-05-06 324 views
0

我正在使用JQuery來生成JSONP請求,而且文檔相當混亂。JQuery JSONP隨機生成回調函數

我有幾個問題:

  • 一個JSONP電話永遠是異步,是正確的?那麼async:false會被忽略?
  • 如果指定了jsonpCallback參數,則在檢索數據時將執行此函數。但之後,success回調將被執行。 jquery建議不要指定jsonpCallback函數(僅用於緩存?)。這個函數與success函數有什麼作用?
  • 如果未指定jsonpCallback,則會創建一個隨機回調函數並將其附加到window對象。像jQuery1360574548776335413_1776656584447,它有什麼作用?它是如何工作的?它與success函數有任何關係嗎?
  • error回調從未被調用過嗎?

這裏是我的代碼:

(function($) { 
    var url = "https://www.googleapis.com/books/v1/volumes/zyTCAlFPjgYC"; 
    $.ajax({ 
     type: 'GET', 
     url: url, 
     // JSONP always async? 
     async: false, 
     jsonp: "callback", 
     jsonpCallback: 'jsonCallback', 
     contentType: "application/json", 
     dataType: 'jsonp', 
     success: function(json) { 
      console.dir(json); 
     }, 
     // Error never called? 
     error: function(e) { 
      console.log(e.message); 
     } 
    }); 
})(jQuery); 

function jsonCallback(json) { 
    $(".test").html(json.volumeInfo.title); 
} 
+0

瞭解'jsonp'實際上是如何在scenese後面工作可能會有所幫助if你還沒有。 http://en.wikipedia.org/wiki/JSONP – 2013-05-06 03:30:19

+0

謝謝,是的,我讀過幾篇關於它的文檔。我發現JQuery API非常困難。特別是隨機生成的回調 – Leonardo 2013-05-06 03:36:27

+0

這裏有一個簡單的手工JSONP函數,它可能會給你一個更好的理解。 http://jsfiddle.net/Axema/您還應該查看瀏覽器中發出的請求,以便您可以確切瞭解響應的外觀。它基本上只是一個正在運行的腳本。 – thebreiflabb 2013-05-06 03:39:22

回答

1

一個JSONP電話永遠是異步,是正確的?所以async:false會被忽略?

即如果指定了jsonpCallback參數是正確

,當檢索到的數據這一功能將被執行。但之後,成功回調也將被執行。 jquery建議不要指定jsonpCallback函數(僅用於緩存?)。這個函數與成功函數有什麼關係?

成功功能是你的回調。 jquery通常會生成一個隨機函數名稱。但是,如果您提出了幾個相同的請求,並且希望允許瀏覽器緩存調用,則可以指定該函數,以便不會創建隨機生成的函數。檢查網絡請求,你會看到(只要你的服務器被設置爲支持它),如果你指定了名字,你應該得到304 - Not Modified(編輯:在第一個之後的後續請求中),而其他呼叫總是返回200 OK

如果未指定jsonpCallback,則會創建一個隨機回調函數並將其附加到窗口對象。像jQuery1360574548776335413_1776656584447,它有什麼作用?它是如何工作的?它與成功功能有任何關係嗎? 錯誤回調從未被調用過嗎?

該回調函數應包含您放入成功的代碼。如果實際請求出現錯誤,例如無效域名,401服務器響應等,則會觸發錯誤事件。

+0

我看到一些混淆: 1)如果我指定了_callback_,「success」仍然在定義的_callback_之後被調用,爲什麼?我應該刪除「成功」嗎? 2)如果我沒有指定_callback_ _random gen。 callback_是我的'成功'嗎?所以_random gen。 function_只能調用'success'?我可以在哪裏讀取它? 3)「該回調函數應該包含你成功投入的代碼」:隱藏點。 4)根據jQuery關於_Error_:「注意:這個處理程序不是跨域腳本和跨域JSONP請求調用的,這是一個Ajax事件。」 – Leonardo 2013-05-06 16:03:51