【问题标题】:Angular2 setTimeout returning ZoneTask rather than a "Number"Angular2 setTimeout 返回 ZoneTask 而不是“数字”
【发布时间】:2017-08-04 18:31:13
【问题描述】:

尝试在angular2中使用setTimeout,我想稍后清除超时。

但是 Angular2 返回的是“ZoneTask”而不是数字

constructor() {
    this.name = 'Angular2'
    this.timeoutId = setTimeout(() => {  
      console.log('hello');
    }, 2000);


    console.log("timeout ID---", this.timeoutId); // Output - ZoneTask {_zone: Zone, runCount: 0, _zoneDelegates: Array[1], _state: "scheduled", type: "macroTask"…}_state: "notScheduled"_zone: Zone_zoneDelegates: nullcallback: function () {cancelFn: nulldata: Objectinvoke: function () {runCount: 0scheduleFn: function scheduleTask(task) {source: "setTimeout"state: (...)type: "macroTask"zone: (...)__proto__: ZoneTask app.ts:24

  }

如何使用普通的 setTimeout 或者在 Angular2 中使用 setTimeout 然后 clearTimeout 的首选是什么?

Plunkr here

【问题讨论】:

  • 尝试不带第一个参数的clearTimeout(this.timeoutId);,或者您可以使用this.timeoutId.data.handleId获取id
  • 是的,但为什么我会收到 ZoneTask?如何进行正常的设置超时!

标签: javascript angular settimeout


【解决方案1】:

更新

发布zone@0.8.18 (2017-09-27)

timer:修复 #314,setTimeout/interval 应该返回原始 timerId (#894) (aec4bd4)

以前的版本

你需要打电话

clearTimeout(this.timeoutId);

你可以拨打timeoutId获取

this.timeoutId.data.handleId

如果您希望使用原生 setTimeout,那么您可以利用以下内容:

this.timeoutId = window['__zone_symbol__setTimeout'](() => {  
  console.log('hello');
}, 2000); // setTimeout will work, but it returns ZoneTask

console.log("timeout ID---", this.timeoutId);
window['__zone_symbol__clearTimeout'](this.timeoutId); // clearTimeout will also work

但我不明白你为什么希望这样

【讨论】:

  • 感谢您的解释。基本上你是说我不需要担心 ZoneTask,只需像我们通常在 javascript 中那样使用 clearTimeout 吗?
  • 是的,你不用担心这个
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2018-11-16
  • 1970-01-01
相关资源
最近更新 更多