在ember.js的递归过程中设置全局变量时遇到错误

时间:2019-05-03 05:37:18

标签: javascript ember.js ember-data ember-cli

所以我已经在余烬代码中实现了一个计时器,该计时器工作正常,但是在运行测试时却失败,我得到此错误提示

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
    }
  }

因此,如果这不是实现计时器的正确方法, 为什么我只在运行测试时收到消息“在被破坏的对象上调用集:”,而在我手动尝试时却没有得到

1 个答案:

答案 0 :(得分:2)

您需要在组件即将销毁时清除计时器。您可以使用willDestroyElement挂钩。 参见:Ember Guide

或者,您可以检查if (this.get('isDestroyed') )来查看组件是否被破坏。 Api Doc。这可能是一个快速的胜利,但是我认为这不是正确的方法。清除计时器是正确的方法。

第二,不要使用setTimeout。而是使用later。参见:Ember Guide