2013-10-01 18 views
11

Ho una domanda su una chiamata AJAX in un intervallo. E perché non funziona, o funziona come funziona.jQuery AJAX con intervallo

Ho questo codice (questo non funziona)

setInterval($.ajax({ 
    //Place code here 
}), 2000); 

ma poi faccio in questo modo

setInterval(function() { 
    $.ajax({ 
    //Do ajax stuff here 
    }); 
}, 2000); 

Ora funziona, ma a me questo sembra che io solo a rendere una funzione extra anonima.

+2

È necessario fornire una funzione da eseguire su ciascun intervallo. '$ .ajax' non restituisce una funzione, quindi non funziona. –

+0

Ottima domanda @Rob! Spero che le mie modifiche ti aiutino a capire l'uso corretto di markdown :) C'è un [meta post] (http://meta.stackexchange.com/questions/3122/formatting-sandbox) che è una sandbox dedicata per giocare con il post formato - forse questo ti aiuterà anche ad abituarti al markdown. – Lix

+2

@Lix grazie per la modifica :) –

risposta

11

setInterval richiede una funzione o un codice eseguibile in formato stringa.

La prima chiamata funzionerà quando viene inserita in una stringa.

setInterval('$.ajax({ //Place code here })', 2000); 

Utilizzando questa sintassi è sconsigliato per gli stessi motivi utilizzando eval.

setInterval può anche richiedere un elenco facoltativo di parametri. Si può approfittare di questo fatto e usare qualcosa di simile:

setInterval($.ajax/*a reference to the ajax function*/, 
2000, {url: 'someurl', success: onSuccess, error: onError}/*args passed to $.ajax*/ 
); 

Si noti che questo non avrebbe funzionato per i metodi degli oggetti che utilizzano this per determinare il contesto, come il valore della this sarà vincolato a window. Cioè, il seguente non avrebbe funzionato:

setTimeout($('h1').css, 1000, {'color': 'red'}); 
+1

Puoi per favore cambiare l'esempio del codice in modo che non usi 'eval'? Sto bene con il disclaimer. – Halcyon

+0

@FritsvanCampen, ma bro, questo è l'unico codice di esempio nel mio post. –

+0

Grazie per aver risposto :) –

3

setInterval richiede una funzione come primo argomento (Reference) ed è per questo setInterval($.ajax({ //Place code here }), 2000); non funziona, perché $.ajax funzione restituisce un jQuery XMLHttpRequest object(Reference)

setInterval(function() { $.ajax({ //Do ajax stuff here }); }, 2000); crea infatti una funzione anonima ma è necessario se non si cita il codice per renderlo un string.

+0

Grazie per aver risposto :) –