81 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ## Task lifecycle
 | |
| 
 | |
| We handle several kinds of tasks in zone.js,
 | |
| 
 | |
| - MacroTask
 | |
| - MicroTask
 | |
| - EventTask
 | |
| 
 | |
| For details, please refer to [here](../dist/zone.js.d.ts)
 | |
| 
 | |
| This document will explain the lifecycle (state-transition) of different types of tasks and also the triggering of various zonespec's callback during that cycle.
 | |
| 
 | |
| The motivation to write this document has come from this [PR](https://github.com/angular/zone.js/pull/629) of @mhevery. This has made the task's state more clear. Also, tasks can now be cancelled and rescheduled in different zone.
 | |
| 
 | |
| ### MicroTask
 | |
| Such as Promise.then, process.nextTick, they are microTasks, the lifecycle(state transition)
 | |
| looks like this.
 | |
| 
 | |
| 
 | |
| 
 | |
| ZoneSpec's onHasTask callback will be triggered when the first microTask were scheduled or the 
 | |
| last microTask was invoked.
 | |
| 
 | |
| ### EventTask
 | |
| Such as EventTarget's EventListener, EventEmitter's EventListener, their lifecycle(state transition)
 | |
| looks like this.
 | |
| 
 | |
| 
 | |
| 
 | |
| ZoneSpec's onHasTask callback will be triggered when the first eventTask were scheduled or the 
 | |
| last eventTask was cancelled.
 | |
| 
 | |
| EventTask will go back to scheduled state after invoked(running state), and will become notScheduled after cancelTask(such as removeEventListener) 
 | |
| 
 | |
| ### MacroTask
 | |
| 
 | |
| #### Non Periodical MacroTask 
 | |
| Such as setTimeout/XMLHttpRequest, their lifecycle(state transition)
 | |
| looks like this.
 | |
| 
 | |
| 
 | |
| 
 | |
| ZoneSpec's onHasTask callback will be triggered when the first macroTask were scheduled or the 
 | |
| last macroTask was invoked or cancelled.
 | |
| 
 | |
| Non periodical macroTask will become notScheduled after being invoked or being cancelled(such as clearTimeout) 
 | |
| 
 | |
| #### Periodical MacroTask 
 | |
| Such as setInterval, their lifecycle(state transition)
 | |
| looks like this.
 | |
| 
 | |
| 
 | |
| 
 | |
| ZoneSpec's onHasTask callback will be triggered when first macroTask was scheduled or last macroTask 
 | |
|  was cancelled, it will not triggered after invoke, because it is periodical and become scheduled again.
 | |
| 
 | |
| Periodical macroTask will go back to scheduled state after invoked(running state), and will become notScheduled after cancelTask(such as clearInterval) 
 | |
| 
 | |
| ### Reschedule Task to a new zone
 | |
| Sometimes you may want to reschedule task into different zone, the lifecycle looks like
 | |
| 
 | |
| 
 | |
| 
 | |
| the ZoneTask's cancelScheduleRequest method can be only called in onScheduleTask callback of ZoneSpec,
 | |
| because it is still under scheduling state.
 | |
| 
 | |
| And after rescheduling, the task will be scheduled to new zone(the otherZoneSpec in the graph),
 | |
| and will have nothing todo with the original zone.
 | |
| 
 | |
| ### Override zone when scheduling 
 | |
| Sometimes you may want to just override the zone when scheduling, the lifecycle looks like
 | |
| 
 | |
| 
 | |
| 
 | |
| After overriding, the task will be invoked/cancelled in the new zone(the otherZoneSpec in the graph),
 | |
| but hasTask callback will still be invoked in original zone.
 | |
| 
 | |
| ### Error occurs in task lifecycle
 | |
| 
 | |
| 
 |