この同じ問題に遭遇しました。あなたが私のような人なら、おそらくこのような 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 ~~~
注意すべき点がいくつかあります。
タスクの実行前後に呼び出されるように見える例の beforeTask と afterTask とは異なり、onInvokeTask フックはタスクの実行の代わりに呼び出されるため、タスクが必要な場合はそのフックでタスクを実行するように指定する必要があります。実行するため、parentZoneDelegate.invokeTask(targetZone, task);
setTimeout(function() { ... }, 0)
run 関数内のコードは、実際には例のすべてのコードと同じタスクで呼び出されるため (新しいタスクで実行される setTimeout 呼び出しのコードを除く)、run 関数内のコードをラップしました。現在のタスクが既に呼び出されているため、onInvokeTask フックは現在のタスクには適用されません。これは、行の周囲にのみ~~~ ZONE START ~~~
and~~~ ZONE END ~~~
が印刷されることを意味しtimeout is up
ます。