【问题标题】:Check if there are scheduled tasks with Angular2 and Zone.js检查是否有使用 Angular2 和 Zone.js 的计划任务
【发布时间】:2016-04-06 16:42:19
【问题描述】:

有没有办法使用Angular2和Zone.js检查是否有计划任务?

假设我有这个组件

import...

@Component({...})
export class MyComponent {

  public myMethod() {
    console.log('enter my method');
    setTimeout(function() { console.log('task1'); }, 1000);
    setTimeout(function() { console.log('task2'); }, 1500);
  }

}

我希望在 task1 和 task2 都完成时收到通知。

在我的应用组件中,我以这种方式订阅了onUnstable 和onStable 事件:

@Component({
  selector: 'app',
  directives: [MyComponent],
  template: `<mycmp></mycmp>`
})
export class AppComponent {

  constructor(private zone:NgZone) {
    console.log('start app component constructor');

    zone.onUnstable.subscribe(function(args){
      console.log('enter unstable');
    });

    zone.onStable.subscribe(function(args){
      console.log('enter stable');
    });
  }
}

所以,当我打电话给myMethod() 时,我期望的是这个日志序列:

enter unstable
enter my method
task1
task2
enter stable

但我明白了:

enter unstable
enter my method
enter stable
enter unstable
task1
enter stable
enter unstable
task2
enter stable

【问题讨论】:

    标签: angular


    【解决方案1】:

    让我试着解释一下结果。

    这里一共有三个微任务。

    任务1

    public myMethod() { ... }

    任务2

    setTimeout(function() { console.log('task1'); }, 1000);

    任务3

    setTimeout(function() { console.log('task2'); }, 1500);

    前三行与Task1的开始和完成有关。

    接下来的三行与Task2的开始和完成有关。

    最后三行与Task3的开始和完成有关。

    每个异步操作(包括可能调用myMethod 的事件处理程序)都会创建一个新的微任务

    【讨论】:

    • 好的,我得到该日志的原因很清楚,但是,有没有办法在完成所有三个任务后得到通知?
    猜你喜欢
    • 2015-10-07
    • 2011-12-22
    • 2021-07-23
    • 2014-02-21
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多