File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ 'use strict' ;
2+
3+ class Reactor {
4+ #tasks = [ ] ;
5+
6+ enqueue ( fn ) {
7+ this . #tasks. push ( fn ) ;
8+ }
9+
10+ start ( ) {
11+ while ( this . #tasks. length ) {
12+ const tasks = this . #tasks. splice ( 0 ) ;
13+ for ( const fn of tasks ) fn ( ) ;
14+ }
15+ }
16+ }
17+
18+ // Usage
19+
20+ const eventLoop = new Reactor ( ) ;
21+
22+ const fakeAsyncRead = ( name ) => ( ) => {
23+ const timeout = Math . random ( ) * 1000 ;
24+ setTimeout ( ( ) => {
25+ console . log ( `[Reactor] ${ name } done` ) ;
26+ } , timeout ) ;
27+ } ;
28+
29+ eventLoop . enqueue ( fakeAsyncRead ( 'File A' ) ) ;
30+ eventLoop . enqueue ( fakeAsyncRead ( 'File B' ) ) ;
31+ eventLoop . enqueue ( fakeAsyncRead ( 'File C' ) ) ;
32+
33+ eventLoop . start ( ) ;
Original file line number Diff line number Diff line change 1+ 'use strict' ;
2+
3+ class Proactor {
4+ #tasks = [ ] ;
5+
6+ enqueue ( fn ) {
7+ this . #tasks. push ( fn ) ;
8+ }
9+
10+ async start ( ) {
11+ while ( this . #tasks. length ) {
12+ const tasks = this . #tasks. splice ( 0 ) ;
13+ for ( const fn of tasks ) await fn ( ) ;
14+ }
15+ }
16+ }
17+
18+ // Usage
19+
20+ const eventLoop = new Proactor ( ) ;
21+
22+ const fakeAsyncRead = ( name ) => async ( ) => {
23+ const delay = Math . random ( ) * 1000 ;
24+ await new Promise ( ( resolve ) => {
25+ setTimeout ( resolve , delay ) ;
26+ } ) ;
27+ console . log ( `[Proactor] ${ name } done after ${ delay } ms` ) ;
28+ } ;
29+
30+ eventLoop . enqueue ( fakeAsyncRead ( 'File A' ) ) ;
31+ eventLoop . enqueue ( fakeAsyncRead ( 'File B' ) ) ;
32+ eventLoop . enqueue ( fakeAsyncRead ( 'File C' ) ) ;
33+
34+ eventLoop . start ( ) ;
You can’t perform that action at this time.
0 commit comments