2013-06-21 76 views
2

我正在使用jQuery 1.9.1對Etsy API執行jsonp。以下是用於調用API的例程;它接受一個簽名請求(url),一個jsonp回調名稱和一個錯誤處理程序。jQuery ajax jsonp在成功後調用錯誤

call: function (signedOAuthRequest, callback, errorFn) { 
    $.ajax({ 
     url: signedOAuthRequest, 
     type: "GET", 
     dataType: "jsonp", 
     jsonpCallback: callback, 
     jsonp: false, 
     crossDomain: true, 
     cache: true, 
     processData: false, 
     error: function (jqXHR, textStatus, errorThrown) { 
      if (errorFn != undefined) { 
       errorFn(jqXHR, textStatus, errorThrown); 
      } 
     } 
    }); 

用法:

call("http://the.api/?signedrequest", "myCallback", myErrorHandler); 

和它的作品。接收到的json對象看起來不錯。一切安好。

除...

緊接着myCallback完成,錯誤處理程序運行。在錯誤處理程序中,狀態碼是200,錯誤消息是"parsererror"。 errorThrown.message是"myCallback was not called"。事情是,myCallback肯定調用和傳遞給它的JSON對象被解析得很好,所以我沒有得到這一點。

爲什麼在其他成功的調用上拋出此錯誤?

+0

舉動回調'成功:callback',刪除'JSONP:FALSE',刪除'jsonpCallback',刪除'cache:true','type:「get」'也不需要。 'processData'也是不需要的。 –

+0

如果您不想在窗口上定義自己的回調,請不要使用jsonp數據類型,只需使用getScript。 –

+0

並通過'myCallback'而不是''myCalback''作爲'callback'參數 – Igor

回答

1

根據意見,什麼是你的問題,這是我怎麼會寫代碼:

function (signedOAuthRequest, callbackName, successFn, errorFn) { 
    $.ajax({ 
     url: signedOAuthRequest, 
     type: "GET", 
     dataType: "jsonp", 
     jsonpCallback: callbackName, 
     jsonp: false, 
     cache: true, 
     success: successFn, 
     error: function (jqXHR, textStatus, errorThrown) { 
      if (typeof errorFn !== 'undefined') { 
       errorFn(jqXHR, textStatus, errorThrown); 
      } 
     } 
    }); 
} 

我做了以下修改:

增加了一個額外的參數來傳遞一個成功回調。這是必需的,因爲jQuery將爲您定義回調,以便它可以檢索成功的響應並解析它。

刪除crossdomain: true因爲是冗餘的

刪除proccessData: false,因爲它不影響JSONP請求,你不傳遞任何數據

新增success: successFn讓jQuery將成功執行successFn與解析的JSON數據。

將callback重命名爲callbackName,以便更清楚地瞭解它包含的內容。

另一種解決方案,如果你仍然堅持定義回調自己是使用腳本的數據類型(從下面的評論取)

$.ajax({ 
    url: signedOAuthRequest, 
    dataType: "script", 
    cache: true 
}); 
+0

不幸的是,添加成功處理程序並沒有改變行爲。和之前一樣,回調運行並傳遞一個格式良好的json對象;緊接着錯誤處理程序正在運行。在錯誤處理程序中,「jqXHR.status」是200,「jqXHR.statusText」是「success」,「textStatus」是「parsererror」,「errorThrown.message」是「fn.home.jsonp.getRecentlyConnectedEoatCallback未調用」。但是那個函數**被稱爲**。從我可以告訴的是,這裏唯一的錯誤是jQuery拋出一個錯誤。 –

+0

停止自己定義該功能! jQuery會爲你定義它。傳遞一個匿名函數或一個函數的引用,該函數的名稱與您傳遞的回調名稱不同。 –

+0

'signedOAuthRequest'是一個已簽名的OAuth請求。如果您允許jQuery將其與其他查詢參數混合,那麼您將破解OAuth。這就是爲什麼'cache:true'被設置的原因。它阻止jQuery將'_'參數添加到'signedOAuthRequest'。這也是爲什麼'jsonp:false'被設置的原因。它阻止了jQuery使用'callback'參數傳遞'signedOAuthRequest'。另外,因爲它最終在請求URL中是必需的,所以'callback'參數*必須包含在*之前*的URL中以便對其進行簽名。 –