2017-03-14 22 views
4

試圖在angular2中使用setTimeout,我想稍後清除超時。Angular2 setTimeout返回ZoneTask而不是「Number」

但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或什麼是首選使用的setTimeout,然後clearTimeout在Angular2?

Plunkr here

+1

嘗試'clearTimeout(this.timeoutId);'沒有第一個參數,或者您可以通過使用'this.timeoutId.data.handleId'獲取id – yurzui

+0

是的,但爲什麼我要獲得ZoneTask?我如何做一個正常的settimeout! – Ajey

回答

5

更新

RELASE [email protected] (2017-09-27)

定時器:固定#314的setTimeout /間隔應該返回原來的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 

但我不明白你爲什麼希望

+0

感謝您的解釋。基本上你說我不需要擔心ZoneTask,只是使用clearTimeout,就像我們通常在javascript中一樣? – Ajey

+0

是的,你不應該擔心這個 – yurzui