1
+ function TaskController ( ) {
2
+ this . tasks = { } ;
3
+ this . isRunning = false ;
4
+ this . interval = 50 ;
5
+ } ;
6
+
7
+ TaskController . prototype . getFirstPriorityTaskName = function ( ) {
8
+ var pTask = null ;
9
+ var priority = 100 ;
10
+ var now = Date . now ( ) ;
11
+ for ( var name in this . tasks ) {
12
+ var task = this . tasks [ name ] ;
13
+ if ( now - task . lastRunTime < task . interval ) {
14
+ continue ;
15
+ }
16
+ if ( pTask === null ) {
17
+ pTask = task ;
18
+ continue ;
19
+ }
20
+ if ( task . wait < pTask . wait ) {
21
+ pTask = task ;
22
+ continue ;
23
+ }
24
+ if ( task . interval > pTask . interval ) {
25
+ pTask = task ;
26
+ continue ;
27
+ }
28
+ if ( task . lastRunTime < pTask . lastRunTime ) {
29
+ pTask = task ;
30
+ continue ;
31
+ }
32
+ }
33
+ if ( pTask === null ) {
34
+ return '' ;
35
+ }
36
+ pTask . wait += pTask . priority ;
37
+ return pTask . name ;
38
+ }
39
+
40
+ TaskController . prototype . loop = function ( ) {
41
+ console . log ( 'loop start' ) ;
42
+ while ( this . isRunning ) {
43
+ var taskName = this . getFirstPriorityTaskName ( ) ;
44
+ var task = this . tasks [ taskName ] ;
45
+ if ( task !== undefined ) {
46
+ task . run ( ) ;
47
+ task . lastRunTime = Date . now ( ) ;
48
+ task . runTimes -- ;
49
+ if ( task . runTimes === 0 ) {
50
+ delete this . tasks [ taskName ] ;
51
+ }
52
+ }
53
+ sleep ( this . interval ) ;
54
+ }
55
+ this . isRunning = false ;
56
+ console . log ( 'loop stop' ) ;
57
+ }
58
+
59
+ TaskController . prototype . updateRunInterval = function ( interval ) {
60
+ if ( interval < this . interval && interval >= 50 ) {
61
+ // min interval = 50
62
+ this . interval = interval ;
63
+ }
64
+ }
65
+
66
+ TaskController . prototype . newTaskObject = function ( name , func , interval , runTimes , priority ) {
67
+ var task = {
68
+ name : name ,
69
+ run : func ,
70
+ interval : interval || 1000 , // 1 second
71
+ runTimes : runTimes || 0 , // <= 0 unlimit
72
+ priority : priority , // same as linux, user can not controll this
73
+ wait : 0 , // when to run, releate to priority
74
+ lastRunTime : 0 , // last run time in millis
75
+ } ;
76
+ return task ;
77
+ }
78
+
79
+ TaskController . prototype . newTask = function ( name , func , interval , runTimes , nextRun , priority = 5 ) {
80
+ if ( nextRun === undefined ) {
81
+ nextRun = false ;
82
+ }
83
+ if ( typeof func !== 'function' ) {
84
+ console . log ( 'Error not a function' , name , func ) ;
85
+ return ;
86
+ }
87
+ var newTask = this . newTaskObject ( name , func , interval , runTimes , priority ) ;
88
+ if ( nextRun ) {
89
+ newTask . lastRunTime = Date . now ( ) ;
90
+ }
91
+ this . updateRunInterval ( newTask . interval ) ;
92
+
93
+ var taskName = 'system_newTask_' + name ;
94
+ var sysTask = this . newTaskObject ( taskName , function ( ) {
95
+ this . tasks [ name ] = newTask ;
96
+ } . bind ( this ) , 0 , 1 , 1 ) ;
97
+ this . tasks [ taskName ] = sysTask ;
98
+ return newTask ;
99
+ } ;
100
+
101
+ TaskController . prototype . removeTask = function ( name ) {
102
+ var taskName = 'system_removeTask_' + Date . now ( ) . toString ( ) ;
103
+ var sysTask = this . newTaskObject ( taskName , function ( ) {
104
+ delete this . tasks [ name ] ;
105
+ } . bind ( this ) , 0 , 1 , 1 ) ;
106
+ this . tasks [ taskName ] = sysTask ;
107
+ }
108
+
109
+ TaskController . prototype . removeAllTasks = function ( ) {
110
+ var taskName = 'system_removeAllTask_' + Date . now ( ) . toString ( ) ;
111
+ var sysTask = this . newTaskObject ( taskName , function ( ) {
112
+ for ( var k in this . tasks ) {
113
+ delete this . tasks [ k ] ;
114
+ }
115
+ } . bind ( this ) , 0 , 1 , 1 ) ;
116
+ this . tasks [ taskName ] = sysTask ;
117
+ }
118
+
119
+ TaskController . prototype . start = function ( ) {
120
+ if ( ! this . isRunning ) {
121
+ this . isRunning = true ;
122
+ this . loop ( ) ;
123
+ }
124
+ }
125
+
126
+ TaskController . prototype . stop = function ( ) {
127
+ if ( this . isRunning ) {
128
+ this . isRunning = false ;
129
+ console . log ( 'wait loop stop...' ) ;
130
+ }
131
+ }
0 commit comments