usando ganchos zone.js en el nodo

Estoy tratando de escribir una demostración simple usando angular / zone.js en el nodo, pero por alguna razón no se beforeTask la beforeTask afterTask ni a la beforeTask afterTask .

Aquí está el código que estoy ejecutando:

 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(); 

Ahora dentro de la zona todo se imprime bien, incluido el nombre de la zona, pero no se llama a ninguno de los ganchos.

¿Me estoy perdiendo algo básico con zone.js + node.js?

(ejecutando con el nodo v5.0.0, zone.js 0.6.23)

Aquí está el repository de muestra. https://github.com/JiaLiPassion/zone-node

Primero, necesita usar la última versión de zone.js y usar zone.js en nodejs, debe requerir zone-node.js, la siguiente es una muestra en ejecución.

 require('./zone-node.js'); function log(str) { Zone.root.run(function() { console.log(str); }); } function foo() { Zone.current.fork({ name: 'fooZone', onScheduleTask: function(delegate, curr, target, task) { log('Zone begin to schedule task not async yet ' + task.source); return delegate.scheduleTask(target, task); }, onInvokeTask: function(delegate, curr, target, task, applyThis, applyArgs) { log('~~~~Zone before invoke async callback~~~~' + task.source); delegate.invokeTask(target, task, applyThis, applyArgs); log('~~~~Zone after invoke async callback~~~~' + task.source); }, }).run(function() { log('current zone, ' + Zone.current.name); setTimeout(function() { log('timeout is up, ', Zone.current.name); }, 100); }); }; foo(); 

y después de ejecutarse en nodejs, la salida será.

 current zone, fooZone Zone begin to schedule task not async yetsetTimeout ~~~~Zone before invoke async callback~~~~setTimeout timeout is up, ~~~~Zone after invoke async callback~~~~setTimeout 

Me encontré con este mismo problema. Si fueras como yo, probablemente viste uno de los ejemplos en el repository de zone.js como este y viste los ganchos antes de Tarea y después de Tarea. Sin embargo, si observa la API y la interfaz ZoneSpec (que especifica los ganchos que zone.fork reconocerá), no se mencionan las tareas antes ni después de la tarea. Esto es probable porque los ganchos han sido renombrados / refactorizados desde el momento en que se escribió ese ejemplo y simplemente no se ha actualizado.

Sin embargo, hay un gancho mencionado en la API llamada “OnInvokeTask” definida como:

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

que se llamará en lugar de una tarea que se invoca cuando se proporciona en ZoneSpec, así que intenté algo como esto:

 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(); 

que imprime el resultado deseado:

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

Algunas cosas a tener en cuenta:

  1. A diferencia de beforeTask y afterTask en el ejemplo que parece que se llama antes y después de que se ejecuta una tarea, se llama al gancho onInvokeTask en lugar de ejecutar una tarea, por lo que debe especificar la ejecución de la tarea en ese gancho si desea la tarea. para ejecutar, por lo tanto, parentZoneDelegate.invokeTask(targetZone, task);

  2. Envolví el código dentro de su función de ejecución en setTimeout(function() { ... }, 0) porque el código dentro de su función de ejecución realmente se llama en la misma tarea que todo el código en su ejemplo (excepto el código en su llamada a setTimeout que se ejecuta en una nueva tarea) y el enlace onInvokeTask no se aplica a la tarea actual ya que la tarea actual ya ha sido invocada. Esto significa que ~~~ ZONE START ~~~ y ~~~ ZONE END ~~~ solo se imprimirían alrededor del timeout is up línea timeout is up .