2015-06-24 49 views
5

Ho il seguente scenario:Javascript: la funzione di chiamata dopo 10 secondi, poi ogni 1 minuto

Ho una funzione javascript ajax loadCars() che ha bisogno di essere chiamato dopo il caricamento della pagina in 10 secondi, e poi ogni 60 secondi .

Il sotto è quello che ho provato finora:

setTimeout(function(){setInterval(function(){loadCars()}, 60000)}, 10000); 

Quello che sta accadendo è che la funzione è chiamata dopo 10 secondi, ma mai più, quello che mi manca?

+0

Se per "non ha funzionato come previsto" si intende non lo chiamava dopo 10 secondi, ma dopo 70, 130 ecc., basta aggiungere un 'loadCars();' direttamente prima di 'setInterval'. Se questo non è ciò che intendi, puoi spiegare ulteriormente "non ha funzionato come previsto" –

+0

Considerare l'aggancio su determinati eventi (come il rendering della pagina finita) piuttosto che i tempi fissi (ritardo di 10 secondi) –

+0

@JamesThorpe In realtà l'esatto contrario è successo, It ha chiamato la funzione dopo 10 secondi e mai più il downvoter –

risposta

5

È necessario chiamare loadCars su setTimeout e su setInterval.

setTimeout(function() { 
 
    console.log('first 10 secs'); 
 
    // loadCars(); 
 
    
 
    setInterval(function() { 
 
      console.log('60 secs has passed'); 
 
      // loadCars(); 
 
    }, 60000); 
 

 
}, 10000); 
 

 
console.log('page loaded');

+0

setInterval è una cattiva pratica, non aspetta che la funzione finisca di eseguire – koningdavid

+0

Non ho scritto che setInterval è una buona pratica. Ho appena risposto alla domanda, corretto il codice. – rogeriolino

1

È possibile chiamare setTimeout(loadCars, 60000) nel metodo loadCars() in questo modo si chiama una volta inizialmente con setTimeout 10 secondi e poi da quel punto si imposta un timeout per 1 minuto fuori ogni volta che esegue .. .

function loadCars() 
{ 
    //code 
    setTimeout(loadCars, 60000); 
} 

setTimeout(loadCars, 10000); 

Se si desidera che il timeout accanto essere programmato solo dopo ajax chiamata è terminata poi o fare uno synchronus ajax chiama o inserisci setTimeout() nella tua chiamata success della tua chiamata ajax ... Quest'ultima opzione è la migliore.

+0

L'ajax sincrono è meglio evitare (al di fuori dei webworker). La [specifica avverte] (https://xhr.spec.whatwg.org/#sync-warning) che è in fase di rimozione, infatti Chrome (non sicuro di altri browser) registra già l'avviso come raccomandato –

+0

@ JamesThorpe hai ragione è per questo che ho fornito un secondo (opzione migliore) inserendolo nella funzione di callback 'successo'. – brso05

+0

Infatti. Ma avrei prima inserito l'opzione consigliata/migliore :) –

1

Non sono d'accordo con le risposte fornite perché usano setInterval o non aspettano che la chiamata ajax sia finita. IMO il tuo dovrebbe impostare un nuovo timeout solo quando la funzione loadcars (e la chiamata ajax) ha finito.

Esempio:

function loadCars() { 
    // ajax call happens here 
    $.ajax() 
    .then(function(){ 
     // call the function here 
     setTimeout(function(){ 
     loadCars(); 
     // wait a minute after you recieved the data 
     }, 60000) 
    }) 
} 

// wait 10 seconds 
setTimeout(function(){ 
    loadCars(); 
}, 10000) 

Il vantaggio se questo è che sarà solo iniziare a impostare un nuovo timeout quando la richiesta HTTP è finito e impedire che la funzione di ottenere fuori sincronia. Se si utilizza setinterval in combinazione con una chiamata ajax, la successiva chiamata ajax avverrà in 60 secondi, anche se quella corrente viene ritardata per 10 secondi (e non si desidera quella).

+1

Vero, ma (nel tuo esempio) non aspetti che la richiesta finisca. – skobaljic

+1

@ brso05 Beh, non ritengono che la chiamata ajax possa essere ritardata – koningdavid

+0

Si può veramente usare '$ .ajax(). Then()'? – skobaljic

1

Per ottenere un maggiore controllo sul timing e la funzione di chiamate è possibile specificare tutti in questo modo:

function loadCars() { 
 
    $('#log').append('Cars loaded<br />'); 
 
}; 
 
function loadManufacturers() { 
 
    $('#log').append('Manufacturers loaded<br />'); 
 
}; 
 
function loadCustomers() { 
 
    $('#log').append('Customers loaded<br />'); 
 
}; 
 
function loadContent(delays, functions) { 
 
    if (functions.length) { 
 
     setTimeout(function() { 
 
      functions.pop()(); 
 
      loadContent(delays, functions); 
 
     }, delays.pop()); 
 
    }; 
 
}; 
 
loadContent([3000, 2000, 1000], [loadCars, loadManufacturers, loadCustomers]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<p id="log"></p>

Playground

Problemi correlati