2016-05-05 3 views
0

У меня есть эта функция. Цель состоит в том, чтобы дождаться завершения внешнего статуса перед вызовом другой функции.бесконечный цикл с 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; 
}; 

Это работает, однако, когда функции ждут один раз, функция вызывается снова и снова.

Я также использую jQuery.

Любая идея, что я делаю неправильно?

+0

'setInterval' работает несколько раз на интервал времени, который вы предоставляете. Из-за этого количество интервалов работает экспоненциально с рекурсивными вызовами. Либо измените его на 'setTimeout', либо просто создайте один' setInterval', который будет отменен с помощью 'clearInterval', когда будет готов. –

+1

... не API, который вы вызываете, позволяет передать функцию обратного вызова? Это было бы намного лучше и более идиоматично, чем опрос на изменение статуса. –

+0

@squint doh! Я хотел использовать setTimeout – jdog

ответ

1

Вот еще одна альтернатива, вы можете попробовать: Определить функцию ожидания, как показано ниже:

function wait(waitComplete, onWaitComplete){ 

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

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

    return false;   
} 

обработчик событий может использовать ждать, как показано ниже:

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

Попробуйте использовать метод clearInterval() для отмены функции интервала, а не wait = false. А также вы неправильно поняли использование интервальных функций. Сделайте это, как показано ниже:

var renderEditClickWrapper = function(event) 
{ 

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

    var wait = setInterval(waitForSavingDone, 800); 

    return false; 
}; 

Вы должны проверить функцию обратного вызова, как указано в комментариях. Это будет более рекомендуется, если вы используете обратный вызов вместо этого.

Смежные вопросы