使用setTimeout调用函数,并使用可选方法来停止

时间:2015-10-23 06:30:25

标签: javascript data-structures

我有一个使用回调运行数学计算的函数。我使用此函数通过多次调用它来执行多个计算,而前一个调用可能仍在处理中。 (我使用setTimeout进行计算)。

问题是,有时候,我需要取消其中一个过早运行的功能。

For example ...用户单击画布上的对象,画布自动放大并平移以关注该对象。但是用户可以将鼠标转到cancel变焦自动化,而平移仍在进行中,我希望这有意义,并且可以理解为什么我可能需要取消一个动作而不是另一个动作。

这是我的代码设置:

var maths = new function() {
  var self = this;

  self.process = function(start, target, duration, callback) {
    var vector = (target - start) / duration;
    var startTime = Date.now();

    function update() {
      start += vector * (Date.now() - startTime);
      startTime = Date.now();

      if (start < target) {
        self.timer = setTimeout(update, 0);
      }
      callback(start);
    }
    update();
  }
};

maths.process(0, 10, 5000, function(value) {
  console.log('Run 1:' + value);
});
maths.process(-5, -1, 5000, function(value) {
  console.log('Run 2: ' + value);
});

所以我想知道,如果需要的话,我怎么能在这里获得取消特定功能的方法呢?

我很难弄清楚什么是管理它的简单方法,因此很容易取消任何一个电话。

1 个答案:

答案 0 :(得分:1)

我想你想要的就是这样完成的(虽然老实说,我不确定我是否正确理解你: - ):

&#13;
&#13;
var maths = new function() {
  var self = this;

  self.process = function(start, target, duration, callback) {
    var vector = (target - start) / duration;
    var startTime = Date.now();
    var didCancel = false;

    function update() {
      if(didCancel) {
        return;
      }
      start += vector * (Date.now() - startTime);
      startTime = Date.now();

      if (start < target) {
        self.timer = setTimeout(update, 0);
      }
      callback(start);
    }
    update();
    return {cancel: function() {didCancel = true;}};
  }
};

var prc1 = maths.process(0, 10, 5000, function(value) {
  console.log('Run 1:' + value);
});
var prc2 = maths.process(-5, -1, 5000, function(value) {
  console.log('Run 2: ' + value);
});

setTimeout(prc1.cancel, 500);
&#13;
&#13;
&#13;