2013-05-17 31 views
0

我有一個簡單的Ajax功能:

function GetJsonData(api) { 

return (
$.ajax({ 
type: 'GET', 
jsonpCallback: 'callback', 
url: api, 
dataType: 'jsonp' 

})); 
} 

,現在當我試圖做多次調用是這樣的:

$.when(
GetJsonData("api"), 
GetJsonData("api"), 
GetJsonData("api"), 
GetJsonData("api"), 
GetJsonData("api") 
) 
.done(function (data1, data2, data3, data4, data5) { 
alert("success"); 

}) 
.fail(function() { 
alert("fail"); 
}); 

每次當我打上面的電話,我大部分都會收到失敗的提醒。只有 有時我會收到成功警報。

但是當我在同一時間沒有超過2個電話的時候,那麼我總是會收到 的成功警報。

任何人都可以請幫我找出我的錯在上面的代碼片段?或者我不得不使用另一種方法來使上述功能正常工作。

+0

您打電話給API的文檔在哪裏?它似乎使用非標準的參數。 –

回答

2

的問題是,你這是在強迫jQuery來使用特定的JSONP回調函數的名字,callback,使用此選項:

jsonpCallback: 'callback' 

所以,如果你有重疊的JSONP調用,jQuery將嘗試使用相同的函數在您的頁面上處理每個函數的結果,並在函數完成其請求時刪除該函數。這顯然有點問題,請求之間相互踩踏。

刪除該選項並允許jQuery創建自己的函數名稱。它將確保函數名稱對每個請求都是唯一的。


在評論下面你說過:

When I remove the jsopCllback parameter I mreceving this error in browser ReferenceError: callback is not defined

而且你看到什麼回來,當你刪除jsonpCallback: 'callback'的說法是:

callback({ "status": 0, "item": 20, "contents": [ { "new1": 196, "new2": 1, "new3": 2, "new4": "abcd", "new5": 41, "new6": "aadsa", } ] }

這意味着JSONP服務您我們正在討論爲名稱使用非標準查詢字符串參數名稱來提供回調,因此它忽略了jQuery使用的標準查詢字符串參數名稱。您必須找出他們期望回調名稱的參數名稱,並將jsonp: 'argNameTheyUse'選項用於ajax

標準參數名是callback,例如:

http://example.com/getsomething?callback=foo

...含義使用回調名稱foo。但是,一些API使用不同的參數,如:

http://example.com/getsomething?mySpecialCallbackArg=foo

如果你調用一個端點,你需要在ajaxjsonp: 'mySpecialCallbackArg'選項。


在進一步的評論中,你說你不能指向API文檔,因爲它是「私人的」。如果它是「私人」的,就像它是你或你公司控制的東西一樣,那麼很好,修復它,以便它遵守callback查詢字符串參數,並將它用作JSONP響應中的函數名稱。這就是JSONP的工作原理。

例如,如果你把它這個請求:

http://example.com/getsomething?callback=foo

...有代碼生成的響應使用foo作爲JSONP回調名稱:

foo({ 
    "data": "here" 
}) 

如果查詢:

http://example.com/getsomething?callback=bar

然後用bar代替:

bar({ 
    "data": "here" 
}) 

這樣,當你進行多個重疊調用時,jQuery可以爲每個調用賦予一個唯一的函數,並且它們最終不會相互踩踏。

如果由於某種原因,您不能不能做到這一點(?!),那麼您必須串聯(而不是並行)串聯您的呼叫。

+0

非常感謝您指出了一個錯誤,但讓我告訴你一些事情如果我從函數中刪除了jsonpCallback:'callback',那麼我將不會得到任何警告「成功」或「失敗」。這可能是因爲所有的API都在回調包裝器中返回結果。任何建議我在這種情況下必須做的? –

+0

@AmmarKhan:這非常令人驚訝。請創建一個[small,self-contained,correct example](http://sscce.org)來展示問題(包括您所調用的JSONP API)並將其發佈到問題中。 (也可以選擇*也*到http://jsbin.com或http://jsfiddle.net。) –

+1

@AmmarKhan:另外,當它失敗時,你在瀏覽器的調試器的Network選項卡中看到了什麼? (如果你的瀏覽器不具有一個切換到一個現代瀏覽器。) –

-1

它可能發生是因爲您並行調用多個ajax調用,並且ajax是異步的。

+0

是的,當然是異步的,我也寫過異步不同步! – Jaid07

+0

它可能是我在之前的發展中遇到的問題之一,這就是爲什麼我發佈。我沒有編輯我的帖子,你錯過了「a」:) – Jaid07

+0

如果你這麼說。 .. –