7
7
* @class
8
8
*/
9
9
10
+ const clone = require ( 'lodash/clone' ) ;
10
11
const forEach = require ( 'lodash/forEach' ) ;
11
12
const Utils = require ( '../utils/utils' ) ;
12
13
13
14
class TaskQueue {
14
15
constructor ( ) {
15
16
this . queue = [ ] ;
17
+ this . storeData = { } ;
16
18
}
17
19
18
20
/**
@@ -24,7 +26,7 @@ class TaskQueue {
24
26
push ( { task, params = { } } ) {
25
27
const id = Utils . genUuid ( ) ;
26
28
const paramsWithId = { ...params , taskId : id } ;
27
- this . queue . push ( { id, task, params : paramsWithId , state : 'waiting' } ) ;
29
+ this . queue . push ( { id, task, params : paramsWithId , state : 'waiting' , file : null } ) ;
28
30
return id ;
29
31
}
30
32
@@ -48,14 +50,27 @@ class TaskQueue {
48
50
*/
49
51
clear ( ) {
50
52
// clear object after 15s
51
- forEach ( this . queue , taskObj => {
52
- setTimeout ( ( ) => {
53
- Utils . destroyObj ( taskObj ) ;
54
- } , 15 * 1000 ) ;
55
- } ) ;
53
+ forEach ( this . queue , obj => Utils . destroyObj ( obj ) ) ;
56
54
this . queue . length = 0 ;
57
55
}
58
56
57
+ /**
58
+ * Store all make complete data
59
+ * @public
60
+ */
61
+ store ( id ) {
62
+ const taskObj = this . getTaskById ( id ) ;
63
+ if ( ! taskObj ) return ;
64
+
65
+ const cloneTaskObj = clone ( taskObj ) ;
66
+ this . storeData [ id ] = cloneTaskObj ;
67
+
68
+ // 15 min after delete
69
+ setTimeout ( ( ) => {
70
+ delete this . storeData [ id ] ;
71
+ } , 15 * 60 * 1000 ) ;
72
+ }
73
+
59
74
getLength ( ) {
60
75
return this . queue . length ;
61
76
}
@@ -65,20 +80,32 @@ class TaskQueue {
65
80
* @public
66
81
*/
67
82
getTaskState ( id ) {
68
- for ( let taskObj of this . queue ) {
69
- if ( id === taskObj . id ) return taskObj . state ;
70
- }
71
-
72
- return 'unknown' ;
83
+ const taskObj = this . getTaskById ( id ) ;
84
+ return taskObj ? taskObj . state : 'unknown' ;
73
85
}
74
86
75
87
/**
76
88
* Get the result file by id
77
89
* @public
78
90
*/
79
91
getResultFile ( id ) {
80
- for ( let taskObj of this . queue ) {
81
- if ( id === taskObj . id ) return taskObj . file ;
92
+ const taskObj = this . getTaskById ( id ) ;
93
+ return taskObj ? taskObj . file : null ;
94
+ }
95
+
96
+ /**
97
+ * Get the task from queue
98
+ * @public
99
+ */
100
+ getTaskById ( id ) {
101
+ for ( let i = 0 ; i < this . queue . length ; i ++ ) {
102
+ const taskObj = this . queue [ i ] ;
103
+ if ( id === taskObj . id ) return taskObj ;
104
+ }
105
+
106
+ for ( let key in this . storeData ) {
107
+ const cloneTaskObj = this . storeData [ key ] ;
108
+ if ( id === cloneTaskObj . id ) return cloneTaskObj ;
82
109
}
83
110
84
111
return null ;
0 commit comments