2013-01-09 130 views
18

我正在使用jQuery getJSON()函數。這個功能獲取數據沒有問題。但有時候會等待,等待等待...並且我的加載欄顯示頁面中間的加載加載。 所以jQuery ajax()函數有一個超時變量。但是我想用getJSON函數。我認爲我可以使用ajaxStart()ajaxStop()函數。但是如何?getJSON超時處理

$('.loadingDiv') 
    .hide() 
    .ajaxStart(function() { 
     $(this).fadeIn(); 
     setTimeout("throw '';",15000) //i used this but didn't work 
     setTimeout("return;",15000) //i used this but didn't work 
     setTimeout("abort();",15000) //i used this but didn't work.(Abort all ajax events) 
    }) 
    .ajaxStop(function() { 
     $(this).fadeOut(); 
    }); 
+0

當您將字符串'setTimeout'(你應該永遠* *做),離這兒eval's他們在全球範圍內。所以,你不能從它返回。 –

+0

你應該在調用'.ajax'時設置一個超時時間。 –

+0

@Asad:OP表示他希望使用'$ .getJSON'而不是'$ .ajax'。 –

回答

13

getJSON()返回一個承諾上,您可以撥打abort功能:

var p = $.getJSON(..., function(){ alert('success');}); 
setTimeout(function(){ p.abort(); }, 2000); 

編輯:但如果你的目標只是中止,如果它需要太多的時間,那麼lethal-吉他的答案是更好的。

+1

+1因爲它允許OP使用'.getJSON'而不是'.ajax' – renab

+0

是的,真正的答案是'使用Ajax'。但我也寫過我的問題。無論如何,這個答案是有益的。謝謝。 – pheaselegen

+0

但它不會幫助這個問題,或將它? 'getJSON'的時間是等待服務器端腳本完成的時間,如果這需要時間,則中止請求,然後發送另一個將不會幫助問題 –

15

getJSON()就是以下的縮寫:

$.ajax({ 
    dataType: "json", 
    url: url, 
    data: data, 
    success: success 
}); 

所以,你可以使用$.ajax()並指定所需的timeout選項。另請參見:http://api.jquery.com/jQuery.getJSON/

+0

+1這可能比我的回答更有用。 –

+0

+1正是我在想什麼(因此我們的答案相似,雖然你的繪圖更快) – renab

+0

還有一個類似的[答案](http://stackoverflow.com/a/7613888/386579),可以被擴展爲爲jquery ajax調用添加超時。 –

1

setTimeout函數在全局範圍內的指定數量的milisecon之後執行一組代碼。

的的getJSON功能(每jQuery的文檔這裏http://api.jquery.com/jQuery.getJSON/)簡寫爲:

$.ajax({ 
    dataType: "json", 
    url: url, 
    data: data, 
    success: success 
}); 

所以你想使你的電話,像這樣:

$.ajax({ 
    dataType: "json", 
    url: url, 
    data: data, 
    success: success, 
    timeout: 15000 
}); 

$('.loadingDiv') 
    .hide() 
    .ajaxStart(function() { 
     $(this).fadeIn(); 
    }) 
    .ajaxStop(function() { 
     $(this).fadeOut(); 
    }); 
9

至於致命吉他提到getJSON()函數只是$.ajax()的簡寫。如果您想要檢測是否發生了超時而不是實際的錯誤,請使用下面的代碼。

var request = $.ajax({ 
    dataType: "json", 
    url: url, 
    data: data, 
    success: function() { }, 
    timeout: 2000 
}).fail(function(xhr, status) { 
    if(status == "timeout") { 
     // do stuff in case of timeout 
    } 
}); 
+0

Typo:'=='not' =' – noahnu

+0

@noahnu謝謝。糾正。 – Bruno

3

總是有核路線,以及:

//Set AJAX timeout to 10 seconds 
$.ajaxSetup({ 
    timeout: 10*1000 
}); 

這將設置所有Ajax請求的程序,使(甚至通過$ .getJSON)有超時10秒(或什麼你有沒有)。

+0

我已經嘗試使用1)$ .getJSON與URL和2)$ .ajax只有'url'和'dataType'屬性。 $ .ajax尊重全局超時(使用本地服務器上的線程睡眠過濾器進行設置),而$ .getJSON則不會。似乎這可能是$ .getJSON中的一個錯誤。 – Jasman

0

我不認爲這些答案是理想的。我知道這已經很晚了,但是你想要做的是在接收JSONP響應時使用.ajax();方法的成功/錯誤回調選項。我將如何構建這個

例子:

// Call 
    $.ajax({ 

     // URL you want to get 
     url: 'http://example.com/json?callback=?', 

     // Set a realistic time in milliseconds 
     timeout: 3000, 

     // Put in success callback function here, this example 
     // shows you the data you got back from the call 
     success: function(data) { 
     console.log(data); 
     }, 

     // Put in an error handling function, just an alert in this case 
     error: function(badData) { 
     alert('The call was unsuccessful'); 
     }, 

     type: 'POST' 
    });