[LayaAir 2.0]Laya.Timer.clear 的源码可能有个问题。

是这样的,当我需要定时执行某个函数时,并且想要在某个情况下clear掉这个执行,clear掉的只是最后入栈的Handler。情景如下: 
        //我想要每隔1s, 执行一次 b 函数(行为),最多执行6次
for(let i = 0; i < 6; i++){
Laya.timer.once(i * 1000, this, this.b, [i], false);
}

//遇到一些需求变化,我希望在2s之后(可能其它某些触发情况), 停止执行 b 函数(行为)
Laya.timer.once(2000,this,()=>{
Laya.timer.clear(this, this.b);
});
[/i]//程序执行的结果是, 2s 之后 b 函数(行为) 仍然在执行, 并没有按我理解的,clear 即会停止掉该行为的执行 [i]
}

public b(i:number) {
console.log("b " + i);
}[/i]
 
然后我看了一下源码 laya.core.js 中 Timer 类中的相关函数, clear函数只清楚了一个Handler,并没有把其他相同Handler一起清除。
相关源码如下:
[i]        clear(caller, method) { //这部分是源码
var handler = this._getHandler(caller, method);
if (handler) {
this._map[handler.key] = null;
handler.key = 0;
handler.clear();
}
}[/i]

如果确是问题,可以考虑改一下,如果不是,可以忽略我的疑惑。我根据源码里面Timer中提供的相关字段和clearAll函数的写法,自己先改了下,贴下面代码了
[i]        clear(caller, method) { // 我在源码上做的修改
var handler = this._getHandler(caller, method);
if (handler) {
var keyTarget = handler.key;
for (var i = 0, n = this._handlers.length; i < n; i++) {
var handler = this._handlers;
if (handler.caller === caller && handler.key === keyTarget) {
this._map[handler.key] = null;
handler.key = 0;
handler.clear();
}
}
}
}
[/i]
已邀请:

Laya_XS

赞同来自:

Laya.Timer.clear  这个方法清理的是指定的某个timer,而不是一下就清理全部timer。你是不是对于接口理解有误?

要回复问题请先

商务合作
商务合作