我有一个使用回调运行数学计算的函数。我使用此函数通过多次调用它来执行多个计算,而前一个调用可能仍在处理中。 (我使用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);
});
所以我想知道,如果需要的话,我怎么能在这里获得取消特定功能的方法呢?
我很难弄清楚什么是管理它的简单方法,因此很容易取消任何一个电话。
答案 0 :(得分:1)
我想你想要的就是这样完成的(虽然老实说,我不确定我是否正确理解你: - ):
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;