所以我已经在余烬代码中实现了一个计时器,该计时器工作正常,但是在运行测试时却失败,我得到此错误提示
Uncaught Error: Assertion Failed: calling set on destroyed object: <front@component:qwtery/my-comp::ember629>.timer = 9
请注意,只有当我运行测试时,这种情况才会发生
这是我的代码
didReceiveAttrs(){
this._super(...arguments);
this.set('timerStop', false);
this.set('anotherTimer', 0);
this.set('timer', null);
var timeLimit = this.get('question.time_limit');
if(timeLimit > 0)
{
this.set('timerEnabled', true);
this.timerFunc(timeLimit,0);
}
},
timerFunc: function(count, val) {
if (count >= 0 && !this.get('timerStop')) {
this.set('timer', count);
this.set('anothertimer', val);
var a = setTimeout(() => {
return this.timerFunc(count-1, val+1);
}, 1000)
}
else {
code to show message that timer has stopped
}
}
因此,如果这不是实现计时器的正确方法, 为什么我只在运行测试时收到消息“在被破坏的对象上调用集:”,而在我手动尝试时却没有得到
答案 0 :(得分:2)
您需要在组件即将销毁时清除计时器。您可以使用willDestroyElement
挂钩。
参见:Ember Guide
或者,您可以检查if (this.get('isDestroyed') )
来查看组件是否被破坏。 Api Doc。这可能是一个快速的胜利,但是我认为这不是正确的方法。清除计时器是正确的方法。
第二,不要使用setTimeout
。而是使用later
。参见:Ember Guide