javascript - 等到功能完成

标签 javascript

在调用完成之前执行函数的最佳方式是什么?

示例 JavaScript 函数:

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

然后我调用函数两次:

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

这个函数并行执行。按顺序执行它们的最佳方法是什么?我只能修改 notifyState 函数。 notifyState 只能通过一个参数执行。

更新: 函数 notifyState 通知 flash 游戏中的实际状态。它将它保存在 html 代码中,当状态改变时状态被覆盖。在 selenium 测试中,我从 html 代码下载状态,但是状态变化太快以至于 selenium 没有注意到这一点,所以我尝试了 sleep JavaScript。

最佳答案

这取决于您是否希望#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 函数作为对您无法控制的第 3 方 Flash 的回调,并且您希望确保对 notifyState 的调用以相同的顺序一个接一个地执行,因此您不会同时运行 2 个对 notifyState 的并行调用。为此,您需要引入一个队列来保持状态并更改 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);
  }
}

关于javascript - 等到功能完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20995315/

相关文章:

javascript - 如何将一个 JavaScript 数组映射到另一个具有不同字段名称的数组?

javascript - jquery 下拉列表刷新

javascript - 在javascript中将max应用于大数组时如何避免堆栈溢出?

javascript - 加载 chrome 扩展并找到当前网站 javascript

javascript - 有没有办法对这个对象数组进行分组或减少

javascript - 如果重复触发,元素将忽略 jQuery

javascript - 将函数分配给函数对象的属性

javascript - 通过 Javascript 创建的元素上的 jQuery

javascript - High Chart 旭日图从内层开始数据

javascript - 如何在 reactjs 中使用单个 ListItem 映射路由?