2015-06-24 18 views
5

ich das folgende Szenario habe:Javascript: Funktion nach 10 Sekunden Anruf, dann jeweils 1 Minute

ich eine Javascript-Ajax-Funktion loadCars() habe, die nach dem Laden der Seite in 10 Sekunden, und dann alle 60 Sekunden aufgerufen werden muss, .

Die unten ist, was ich bisher versucht habe:

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

Was geschieht, dass die Funktion nach 10 Sekunden aufgerufen wird, aber nie wieder, was bin ich dabei?

+0

Wenn von „nicht wie erwartet“ Sie bedeuten es hat es nicht nach 10 Sekunden aufgerufen, aber nach 70, 130 usw., fügen Sie einfach ein extra 'loadCars();' direkt vor 'setInterval' hinzu. Wenn das nicht ist, was du meinst, kannst du weiter erklären "hat nicht wie erwartet funktioniert" –

+0

Überlegen Sie, bestimmte Ereignisse anzuhangen (wie das Rendern der Seite) und nicht feste Zeiten (10 Sekunden Verzögerung) –

+0

@JamesThorpe Eigentlich passierte genau das Gegenteil, It rief die Funktion nach 10 Sekunden an und nie wieder –

Antwort

5

Sie müssen loadCars auf setTimeout und setInterval aufrufen.

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 ist schlechte Praxis, es wartet nicht auf die Funktion zum Abschluss der Ausführung – koningdavid

+0

Ich habe nicht geschrieben, dass setInterval eine gute Übung ist. Ich habe gerade die Frage beantwortet, den Code repariert. – rogeriolino

1

Sie setTimeout(loadCars, 60000) in Ihrem loadCars() Methode aufrufen kann, die, wie Sie es mit setTimeout 10 Sekunden einmal zunächst rufen dann von diesem Punkt ist es ein Timeout für 1 Minute heraus führt sie jedes Mal setzt .. .

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

setTimeout(loadCars, 10000); 

Wenn Sie erst nach ajax Anruf dann eine synchronus machen entweder abgeschlossen ist geplant wollen das nächste Timeout zu ajax Anruf oder setzen Sie die setTimeout() in Ihrem success Rückruf Ihrer ajax Anruf ... Letzteres ist die bessere Option.

+0

Synchrone Ajax wird am besten vermieden (außerhalb von Webworkern). Die [Spezifikation warnt] (https://xhr.spec.whatwg.org/#sync-warning), dass sie gerade entfernt wird. In der Tat protokolliert Chrome (nicht sicher von anderen Browsern) bereits die Warnung wie empfohlen –

+0

@ JamesThorpe du bist richtig, deshalb habe ich eine zweite (bessere Option) in die 'success' Callback Funktion eingefügt. – brso05

+0

In der Tat. Aber ich hätte die empfohlene/bessere Option zuerst gesetzt :) –

1

Ich stimme nicht mit den gegebenen Antworten überein, weil sie setInterval verwenden oder warten Sie nicht, bis der Ajax-Aufruf beendet ist. IMO sollte nur dann ein neues Timeout gesetzt werden, wenn die Funktion loadcars (und der Ajax-Aufruf) beendet ist.

Beispiel:

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) 

Der Vorteil, wenn dies ist, dass es nur einen neuen Timeout einstellen, wenn die HTTP-Anforderung abgeschlossen starten und die Funktion verhindert, dass nicht mehr synchron zu bekommen. Wenn Sie setinterval in Verbindung mit einem Ajax-Aufruf verwenden, wird der nächste Ajax-Aufruf in 60 Sekunden ausgeführt, selbst wenn der aktuelle Ajax-Aufruf um 10 Sekunden verzögert wird (und Sie wollen das nicht).

+1

Stimmt, aber (in Ihrem Beispiel) warten Sie nicht auf die Anfrage zu beenden. – skobaljic

+1

@ brso05 Nun, sie denken nicht, dass der Ajax-Aufruf entweder – koningdavid

+0

verzögert werden kann Kannst du wirklich '$ .ajax(). Then()'? – skobaljic

1

Um mehr Kontrolle über die Zeitpunkte zu bekommen und Funktion ruft man sie alle auf diese Weise geben könnte:

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

Verwandte Themen