1

我正在尝试实现简单zone.afterTaskbeforeTask钩子,但尽管代码没有抛出任何错误,但这些方法永远不会被调用。

我在 github 中搜索了 Zone repo,除了示例中使用的方法之外,在源代码中找不到对这些方法的任何引用。计数示例确实使用afterTaskbeforeTask但我设置了一个调试器,并看到这些方法也从未在他们的示例中被调用。

看起来这些方法已被弃用,如果不是,请告诉我我做错了什么。

这是我的代码 -

import { Component } from 'angular2/core';

@Component({
  template: `
      <div>
        <p>Basic use of Zone</p>
        <button (click)="startTask()">Start Task</button>
        <p> Time taken {{timeTaken}}</p>
      </div>
    `
})
export class HelloZone {
  timeTaken: any;

  task1(){
    for (let i = 0; i < 1e5; i++);
  }

  startTask() {
    let startTime;

    let myZone = Zone.parent.fork({
      beforeTask: function() {
        startTime = new Date();
      },
      afterTask: function() {
        this.timeTaken = new Date() - startTime;
      }
    });
    myZone.run(function(){
      this.task1();
      setTimeout(this.task1, 2000);
      this.task1();
    }.bind(this));
  }
}
4

1 回答 1

0

我认为对于您的用例,您可以利用onInvokeTaskonHasTask挂钩,如下所述:

export class HelloZone {
  timeTaken: any;

  constructor(private zone:NgZone) {

  }

  (...)

  startTask() {
    let startTime;

    let myZone = Zone.current.fork({
      onInvokeTask: (parent, current, target, task) => {
        startTime = new Date();
        parent.invokeTask(target, task);
      },
      onHasTask: (parent, current, target, hasTask) => {
        if (!hasTask.macroTask) {
          this.zone.run(() => {
            this.timeTaken = new Date() - startTime;
          });
        }
      }
    });
    myZone.run(() => {
      this.task1();
      setTimeout(this.task1, 2000);
      this.task1();
    });
  }
}

看到这个 plunkr:https ://plnkr.co/edit/EH8uy66ke1i61QhE9fYi?p=preview 。

于 2016-04-26T09:36:25.123 回答