1

我有功能GoToCell(number); 这个功能可以渲染玩家的动作。我有这样一种情况发生:在最后一次执行调用之前,该人调用了此函数两次。一个呼叫被挂断并从 2 个呼叫开始运行。我需要调用两次都没有工作,直到结束是怎么执行的呢?

4

3 回答 3

4

您遇到的问题可能与线程无关,而是与动画或电影播放有关。从这个问题很难说。

但在这两种情况下的答案是确保您设置一个标志,告诉自己动画或任何正在进行中,并在其上使用完成回调来清除标志。然后,当用户单击小部件或其他任何内容时检查标志,并且不要启动动画/等的第二个副本。

同样,没有任何代码或上下文,很难具体提供帮助,所以这里有一个使用 jQuery 动画的示例。我不是说“使用 jQuery”或任何东西,只是演示上面列出的概念(设置标志,防止重复激活,使用完成回调):

现场复制| 资源

HTML:

<input type="button" id="theButton" value="Click to animate">
<div id="target"></div>
<div id="output"></div>

CSS:

#target {
  position: absolute;
  left: 0px;
  top: 3em;
  border: 1px solid black;
  background-color: #00d;
  width: 20px;
  height: 20px;
}
#output {
  margin-top: 6em;
}

JavaScript:

jQuery(function($) {

  var animating = false;
  var direction = "+";

  $("#theButton").click(function() {
    // Are we already animating?
    // (Of course, ideally you'd disable the button or similar)
    if (animating) {
      // Yes, say we're busy
      display("Animation still in progress");
    }
    else {
      // No, do it
      display("Animating...");
      animating = true;
      $("#target").animate({
        left: direction + "100"
      }, 3000, function() {
        // Completion callback, we're not animating anymore
        animating = false;
        display("Done");
      });
      direction = direction === "+" ? "-" : "+";
    }
  });

  function display(msg) {
    $("<p>").html(String(msg)).appendTo("#output");
  }

});
于 2012-04-30T14:09:09.790 回答
1

你可能想看看网络工作者。 https://developer.mozilla.org/En/Using_web_workers

到目前为止,在 javascript 中具有类似线程的行为是唯一的可能性。不过,我认为并非所有浏览器都实现了它。

于 2012-04-30T14:07:51.443 回答
1

我不确定你需要工人或线程来做你正在寻找的东西。

IMO Underscore 的 Functions 功能可以帮助您实现所需的功能debouncethrottleonce

如果您不想使用下划线,我建议您阅读库的源代码,它非常简短且注释很好。

于 2012-04-30T14:08:22.100 回答