File tree Expand file tree Collapse file tree 1 file changed +50
-0
lines changed Expand file tree Collapse file tree 1 file changed +50
-0
lines changed Original file line number Diff line number Diff line change
1
+ class AsyncQueue {
2
+ constructor ( ) {
3
+ this . queue = [ ] ;
4
+ this . pendingPromises = [ ] ;
5
+ }
6
+
7
+ // Add an item to the queue asynchronously
8
+ async enqueue ( item ) {
9
+ if ( this . pendingPromises . length ) {
10
+ const resolve = this . pendingPromises . shift ( ) ;
11
+ resolve ( item ) ;
12
+ } else {
13
+ this . queue . push ( item ) ;
14
+ }
15
+ }
16
+
17
+ // Remove and return an item from the queue asynchronously
18
+ async dequeue ( ) {
19
+ if ( this . queue . length ) {
20
+ return Promise . resolve ( this . queue . shift ( ) ) ;
21
+ }
22
+
23
+ return new Promise ( ( resolve ) => {
24
+ this . pendingPromises . push ( resolve ) ;
25
+ } ) ;
26
+ }
27
+
28
+ // Check if the queue is empty
29
+ isEmpty ( ) {
30
+ return this . queue . length === 0 ;
31
+ }
32
+ }
33
+
34
+ // Example usage:
35
+ ( async ( ) => {
36
+ const asyncQueue = new AsyncQueue ( ) ;
37
+
38
+ asyncQueue . enqueue ( 10 ) ;
39
+ asyncQueue . enqueue ( 20 ) ;
40
+ asyncQueue . enqueue ( 30 ) ;
41
+
42
+ console . log ( await asyncQueue . dequeue ( ) ) ; // 10
43
+ console . log ( await asyncQueue . dequeue ( ) ) ; // 20
44
+
45
+ setTimeout ( ( ) => asyncQueue . enqueue ( 40 ) , 1000 ) ;
46
+
47
+ console . log ( await asyncQueue . dequeue ( ) ) ; // 30
48
+ console . log ( await asyncQueue . dequeue ( ) ) ; // 40
49
+ } ) ( ) ;
50
+
You can’t perform that action at this time.
0 commit comments