等到功能完成

时间:2014-01-08 12:12:17

标签: javascript

在呼叫结束之前执行功能的最佳方法是什么?

JavaScript函数示例:

var notifyState = function(state) {
setTimeout(function () {
  /*Do something*/
}, 2000);
};

然后我调用两次函数:

notifyState('State1');
notifyState('State2');

此函数在paraller中执行。顺序执行它们的最佳方法是什么?我只能修改notifyState功能。 notifyState只能使用一个参数执行。

更新 函数notifyState通知Flash游戏中的实际状态。它将它保存在html代码中,当状态改变时状态为覆盖。在selenium测试我从html代码下载状态,但状态变化太快,selenium没注意到这个,所以我尝试睡眠JavaScript。

3 个答案:

答案 0 :(得分:6)

这取决于您是否希望 #notifyState 使用setTimeout。如果您不需要 setTimeout ,那么您只需按如下方式重写:

var notifyState = function(state) {
  /* Do something */
}

notifyState('State 1');
notifyState('State 2');

如果你想保留 setTimeout 并对调用进行链接,那么在第一次通知之后执行第二次通知,则必须提供回调:

var notifyState = function(state, callback) {
  setTimeout(function() {
    /* Do something */
    if (callback) {
      callback();
    }
  }, 2000);
}

notifyState('State 1', function() {
  notifyState('State 2');
});

修改

似乎OP问题不同。我的理解是你提供 #notifyState 函数作为你不能控制的第三方Flash的回调,你想确保对notifyState的调用以相同的顺序和一个接一个地执行,因此,您没有同时运行 notifyState 的2个并行调用。为此,您需要引入一个队列来保持状态并更改 notifyState 函数,以便当时只执行一个状态。我将假设你需要 setTimeout 在这里很重要,并保持这种方式。请参阅以下代码:

var Queue = [],
    running = false;
var notifyState = function(state) {
  if (running) {
    Queue.push(state);
  } else {
    running = true;
    setTimeout(function() {
      /* Do something */
      running = false;
      var nextState = Queue.pop();
      if (nextState) {
        notifyState(nextState);
      }
    }, 2000);
  }
}

答案 1 :(得分:2)

添加一个可选参数,作为回调函数。检查参数实际上是否为函数,如果是,则运行它。

var notifyState = function(state,fn) {
    setTimeout(function () {
      /*DoSomething*/
      if(typeof(fn)=='function'){ fn(); }
    }, 2000);
};

然后您可以调用这样的函数:

notifyState('State1', function(){
    notifyState('State2');
});

JSFiddle

答案 2 :(得分:0)

var notifyState = function(state, callback) {
    setTimeout(function () {

    /*Do something*/

    callback();

    }, 2000);
};

通话功能:

var state1CompleteHandler = function() {
    // code to execute when state 1 logic completes
    notifyState('State2');
}
notifyState('State1', state1CompleteHandler);