2016-05-05 16 views
0

Ich habe diese Funktion. Der Zweck besteht darin, auf das Beenden eines externen Status zu warten, bevor eine andere Funktion aufgerufen wird.Endlosschleife mit SetInterval

var renderEditClickWrapper = function(event) 
{ 
    var wait = false; 
    function waitForSavingDone(){ 
     if (options.dataStatusHandler.getStatus() == 'saving'){ 
      wait = setInterval(function(){ 
       waitForSavingDone(); 
      }, 800); 
     }else{ 
      wait = false; 
      call.renderEdit(event.data.name, event.data.rowId, event.data.parentId, event.data.options); 
     } 
    } 

    if (!wait) waitForSavingDone(); 

    return false; 
}; 

Dies funktioniert, aber wenn die Funktionen einmal warten, wird die Funktion immer wieder aufgerufen.

Ich benutze auch jQuery.

Irgendeine Idee, was ich falsch mache?

+0

A 'setInterval' läuft immer wieder auf die Intervalldauer, die Sie bereitstellen. Aus diesem Grund erhöht sich die Anzahl der ausgeführten Intervalle exponentiell mit den rekursiven Aufrufen. Entweder ändern Sie es in 'setTimeout', oder erstellen Sie einfach ein einzelnes' setInterval', das mit 'clearInterval' beendet wird, wenn es fertig ist. –

+1

... lässt Sie die API, die Sie aufrufen, nicht eine Callback-Funktion übergeben? Das wäre viel netter und idiomatischer als die Umfragen, um den Status zu ändern. –

+0

@squint doh! Ich wollte setTimeout verwenden – jdog

Antwort

1

Hier ist eine weitere Alternative können Sie versuchen: eine Wartefunktion definieren, wie unten:

function wait(waitComplete, onWaitComplete){ 

    if (waitComplete()) { 
     onWaitComplete(); 
     return true; 
    } 

    setTimeout(function(){ 
     console.log('waiting...'); 
     wait(waitComplete, onWaitComplete); 
    }, 800); 

    return false;   
} 

Ereignishandler wie unten warten können:

var renderEditClickWrapper = function(event) 
{ 
    function isWaitComplete() { 
    return (options.dataStatusHandler.getStatus() != 'saving'); 
    } 

    function onWaitComplete() { 
    call.renderEdit(event.data.name, event.data.rowId, 
        event.data.parentId, event.data.options); 

    } 
    wait(isWaitComplete, onWaitComplete); 
}; 
0

Versuchen Sie, clearInterval() Methode zu verwenden, um die Intervallfunktion statt wait = false abzubrechen. Und Sie haben auch die Verwendung von Intervallfunktionen missverstanden. Tun Sie es wie folgt:

var renderEditClickWrapper = function(event) 
{ 

    function waitForSavingDone() { 
    if (options.dataStatusHandler.getStatus() !== 'saving') { 
     clearInterval(wait); 
    } 
    } 

    var wait = setInterval(waitForSavingDone, 800); 

    return false; 
}; 

Sie sollten die Rückruffunktion wie in den Kommentaren erwähnt überprüfen. Es wird mehr empfohlen, wenn Sie stattdessen Callback verwenden.