2013-01-09 22 views
18

Używam funkcji jQuery getJSON(). Ta funkcja pobiera dane bez problemu. Ale czasami czekam, czekam czekając ... A mój pasek ładowania pokazuje ładowanie ładowania loadin na środku strony. Tak więc funkcja jQuery ajax() ma zmienną timeout. Ale chcę użyć funkcji getJSON. I myślę, że mogę korzystać z funkcji ajaxStart() i ajaxStop(). Ale jak?Obsługa timeoutowania 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

Po przejechaniu ciągi do 'setTimeout' (które powinny * nigdy * nie), to' eval's je w zasięgu globalnym. Więc nie możesz tego "zwrócić". –

+0

Powinieneś ustawić limit czasu w wywołaniu '.ajax' –

+0

@Asad: OP mówi, że chce użyć' $ .getJSON' zamiast '$ .ajax'. –

Odpowiedz

13

getJSON() zwraca obietnicy, na której można zadzwonić do abort funkcję:

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

EDIT: ale jeśli twoim celem jest po prostu przerwać jeśli trwa zbyt długo, a potem lethal- odpowiedź gitary jest lepsza.

+1

+1, ponieważ pozwala OP na użycie '.getJSON' zamiast' .ajax' – renab

+0

Tak, prawdziwa odpowiedź brzmi "używaj Ajaxa". Ale napisałem też w moim pytaniu. W każdym razie ta odpowiedź była pomocna. Dzięki. – pheaselegen

+0

, ale to nie pomoże problemu czy nie? czas potrzebny do pobrania 'getJSON' to oczekiwanie na ukończenie skryptu po stronie serwera, a jeśli to wymaga czasu, przerwanie żądania, a następnie wysłanie kolejnego nie pomoże w rozwiązaniu problemu –

15

getJSON() jest tylko skrótem, co następuje:

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

Więc można użyć $.ajax() i określ opcję timeout jako pożądane. Zobacz także: http://api.jquery.com/jQuery.getJSON/

+0

+1 jest to prawdopodobnie bardziej przydatne dla OP niż moja odpowiedź. –

+0

+1 dokładnie to, co myślałem (stąd podobieństwo w naszych odpowiedziach, ty byłeś szybszy w losowaniu) – renab

+0

Istnieje podobna [odpowiedź tutaj] (http://stackoverflow.com/a/7613888/386579), która może być przedłużony, aby dodać limit czasu dla wywołania ajax jquery. –

1

Funkcja setTimeout wykonuje zestaw kodu po określonej liczbie milisecons w zakresie globalnym.

Funkcja getJSON (za dokumentacji jQuery tutaj http://api.jquery.com/jQuery.getJSON/) jest skrótem dla:

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

więc chcesz, aby Twoje wezwanie tak:

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

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

jako śmiertelna-gitara wspomniano getJSON() funkcja jest tylko skrótem dla $.ajax(). Jeśli chcesz wykryć, czy wystąpił limit czasu, a nie rzeczywisty błąd, skorzystaj z poniższego kodu.

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 Dziękuję. poprawione. – Bruno

3

Zawsze trasa jądrowej, a także:

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

Spowoduje to ustawienie wszystkich AJAX żąda program robi (nawet poprzez $ .getJSON), aby mieć czas na 10 sekund (albo co czy ty).

+0

Próbowałem tego przy użyciu 1) $ .getJSON z adresem URL i 2) $ .ajax z atrybutami "url" i "dataType". $ .ajax respektuje globalny limit czasu (ustawiony za pomocą filtra wątku wątku na moim lokalnym serwerze), a $ .getJSON nie. Wygląda na to, że może to być błąd w $ .getJSON. – Jasman

0

Nie sądzę, że któraś z tych odpowiedzi jest idealna. Wiem, że jest to spóźnione o wiele lat, ale kiedy chcesz uzyskać odpowiedź JSONP, to powinieneś użyć opcji wywołania zwrotnego sukcesu/błędu metody .ajax();.

Przykład tego, jak będzie wyglądać struktura to:

// 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' 
    }); 
Powiązane problemy