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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |