无限循环与 SetInterval

endless loop with 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。

知道我做错了什么吗?

尝试使用clearInterval()方法取消间隔功能,而不是wait = false。而且您还误解了区间函数的用法。像下面那样做:

var renderEditClickWrapper = function( event )
{

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

  var wait = setInterval(waitForSavingDone, 800);

  return false;
};

您应该检查评论中提到的回调函数。如果改用回调会更推荐。

您可以尝试以下另一种选择: 定义一个等待函数如下:

 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);
 };