2013-01-09 21 views
18

Sto usando la funzione jQuery getJSON(). Questa funzione consente di ottenere dati senza problemi. Ma a volte in attesa, in attesa di attesa ... E la mia barra di caricamento mostra caricamento caricamento carico al centro della pagina. Quindi la funzione jQuery ajax() ha una variabile di timeout. Ma voglio usare la funzione getJSON. E penso di poter usare le funzioni ajaxStart() e ajaxStop(). Ma come?getJSON timeout handling

$('.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

Quando si passa stringhe 'setTimeout' (che si dovrebbe * mai * fare), si' li eval's in ambito globale. Quindi, non puoi "tornare" da esso. –

+0

Dovresti impostare un timeout nel tuo invocazione di '.ajax' –

+0

@Asad: L'OP dice che vuole usare' $ .getJSON' invece di '$ .ajax'. –

risposta

13

getJSON() restituisce una promessa su cui è possibile richiamare la funzione abort:

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

EDIT: ma se il tuo obiettivo è solo quello di abortire se ci vuole troppo tempo, quindi lethal- la risposta della chitarra è migliore.

+1

+1 perché consente all'OP di usare '.getJSON' piuttosto che' .ajax' – renab

+0

Sì, la risposta vera è 'usa Ajax'. Ma ho scritto anche nella mia domanda. Comunque questa risposta è stata utile. Grazie. – pheaselegen

+0

ma non aiuterà il problema o lo farebbe? il tempo impiegato per 'getJSON' è il tempo di aspettare che lo script sul lato server sia completato e se ciò richiede tempo allora abortire la richiesta e poi inviarne un'altra non aiuterà il problema –

15

getJSON() è solo una scorciatoia per il seguente:

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

Così si potrebbe usare $.ajax() e specificare l'opzione timeout, se lo desideri. Vedi anche: http://api.jquery.com/jQuery.getJSON/

+0

+1 questo è probabilmente più utile a OP della mia risposta. –

+0

+1 esattamente quello che stavo pensando (da qui la somiglianza nelle nostre risposte, sei stato più veloce nel disegnare però) – renab

+0

C'è una risposta simile [http://stackoverflow.com/a/7613888/386579] che può essere esteso per aggiungere il timeout per la chiamata ajax jquery. –

1

la funzione setTimeout esegue un set di codice dopo un numero specificato di milisecon nell'ambito globale.

La funzione getJSON (per la documentazione di jQuery qui http://api.jquery.com/jQuery.getJSON/) è una scorciatoia per:

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

modo si vuole effettuare la chiamata in questo modo:

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

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

letale-chitarra menzionato getJSON() la funzione è solo una scorciatoia per $.ajax(). Se si desidera rilevare se si è verificato un timeout anziché un errore effettivo, utilizzare il codice riportato di seguito.

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 Grazie. corretto. – Bruno

3

C'è sempre il percorso nucleare e:

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

Questo imposterà tutto l'AJAX richiede il vostro programma rende (anche via $ GetJSON) per avere un tempo di 10 secondi (o cosa hai).

+0

Ho provato questo usando 1) $ .getJSON con un URL e 2) $ .ajax con solo attributi 'url' e 'dataType'. $ .ajax rispetta il timeout globale (impostato utilizzando un filtro di sospensione del thread sul mio server locale) e $ .getJSON no. Sembra che questo possa essere un bug in $ .getJSON. – Jasman

0

Non credo che nessuna di queste risposte sia l'ideale. So che è in ritardo di anni, ma ciò che si vuole fare è utilizzare le opzioni di callback di successo/errore del metodo .ajax(); quando si riceve una risposta JSONP.

Esempio di come avrei strutturare questo:

// 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' 
    });