4

ノードでangular/zone.jsを使用して簡単なデモを作成しようとしていますが、何らかの理由でbeforeTaskまたはafterTaskが呼び出されていません。

ここに私が実行しているコードがあります:

require('zone.js');

function foo () {
  Zone.current.fork({
    name: 'foo_zone',
    
    beforeTask: function () {
      console.log('~~~ ZONE START ~~~');
    },
    
    afterTask: function () {
      console.log('~~~ ZONE END ~~~');
    }
  })
    .run(function () {
      console.log('in the zone');
      console.log('Zone.current.name', Zone.current.name); // prints foo_zone
      setTimeout(() => {
        console.log('timeout is up');
      }, 1000);
    });
}
foo();

ゾーン内では、ゾーン名を含むすべてが正常に出力されますが、どちらのフックも呼び出されません。

zone.js + node.js で基本的なものが足りないのですか?

(ノード v5.0.0、zone.js 0.6.23 で実行)

4

2 に答える 2

0

この同じ問題に遭遇しました。あなたが私のような人なら、おそらくこのような zone.js リポジトリーの例の 1 つを見て、beforeTask と afterTask のフックが使用されているのを見たでしょう。ただし、APIを見て ZoneSpec インターフェイス (zone.fork が認識するフックを指定する) を見ると、beforeTask または afterTask についての言及はどこにもありません。これは、例が作成されてからフックの名前が変更/リファクタリングされ、更新されていないことが原因である可能性があります。

ただし、次のように定義された「onInvokeTask」という名前の API で言及されているフックがあります。

onInvokeTask?: (parentZoneDelegate: ZoneDelegate, currentZone: Zone, targetZone: Zone, task: Task, applyThis: any, applyArgs: any) => any;

これは、ZoneSpec で指定されたときに呼び出されるタスクの代わりに呼び出されるため、次のようなことを試しました。

require('zone.js');

function foo () {
  Zone.current.fork({
    name: 'foo_zone',

    onInvokeTask: function (parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
      console.log('~~~ ZONE START ~~~');
      parentZoneDelegate.invokeTask(targetZone, task);
      console.log('~~~ ZONE END ~~~');
    },
  })
    .run(function () {
      setTimeout(function() {
        console.log('in the zone');
        console.log('Zone.current.name', Zone.current.name); // prints foo_zone
        setTimeout(() => {
          console.log('timeout is up');
        }, 1000);
      }, 0);
    });
}
foo();

目的の結果を出力します。

~~~ ZONE START ~~~
in the zone
Zone.current.name foo_zone
~~~ ZONE END ~~~
~~~ ZONE START ~~~
timeout is up
~~~ ZONE END ~~~

注意すべき点がいくつかあります。

  1. タスクの実行前後に呼び出されるように見える例の beforeTask と afterTask とは異なり、onInvokeTask フックはタスクの実行の代わりに呼び出されるため、タスクが必要な場合はそのフックでタスクを実行するように指定する必要があります。実行するため、parentZoneDelegate.invokeTask(targetZone, task);

  2. setTimeout(function() { ... }, 0)run 関数内のコードは、実際には例のすべてのコードと同じタスクで呼び出されるため (新しいタスクで実行される setTimeout 呼び出しのコードを除く)、run 関数内のコードをラップしました。現在のタスクが既に呼び出されているため、onInvokeTask フックは現在のタスクには適用されません。これは、行の周囲にのみ~~~ ZONE START ~~~and~~~ ZONE END ~~~が印刷されることを意味しtimeout is upます。

于 2016-11-25T05:19:42.030 に答える