File tree Expand file tree Collapse file tree 1 file changed +49
-16
lines changed
Expand file tree Collapse file tree 1 file changed +49
-16
lines changed Original file line number Diff line number Diff line change 11'use strict' ;
22
3- const getConferences = ( ) => {
4- let onDone = null ;
5- const deferred = {
6- onData : callback => onDone = callback
7- } ;
8- setTimeout ( ( ) => {
9- if ( onDone ) onDone ( [ 'Tehran' , 'Yalta' , 'Potsdam' ] ) ;
10- } , 5000 ) ;
11- return deferred ;
12- } ;
3+ class Deferred {
4+ constructor ( ) {
5+ this . value = undefined ;
6+ this . error = null ;
7+ this . finished = false ;
8+ this . events = { } ;
9+ }
10+
11+ resolve ( value ) {
12+ if ( this . finished ) return ;
13+ this . value = value ;
14+ this . finished = true ;
15+ const event = this . events [ 'done' ] ;
16+ if ( event ) event . forEach ( fn => fn ( value ) ) ;
17+ }
18+
19+ reject ( err ) {
20+ if ( this . finished ) return ;
21+ this . error = err ;
22+ this . finished = true ;
23+ const event = this . events [ 'fail' ] ;
24+ if ( event ) event . forEach ( fn => fn ( err ) ) ;
25+ }
26+
27+ done ( fn ) {
28+ if ( this . finished ) return ;
29+ const event = this . events [ 'done' ] ;
30+ if ( event ) event . push ( fn ) ;
31+ else this . events [ 'done' ] = [ fn ] ;
32+ return this ;
33+ }
34+
35+ fail ( fn ) {
36+ if ( this . finished ) return ;
37+ const event = this . events [ 'fail' ] ;
38+ if ( event ) event . push ( fn ) ;
39+ else this . events [ 'fail' ] = [ fn ] ;
40+ return this ;
41+ }
42+ }
1343
1444// Usage
1545
16- const conferences = getConferences ( ) ;
46+ const conferences = new Deferred ( )
47+ . done ( list => {
48+ console . log ( list ) ;
49+ } )
50+ . fail ( err => {
51+ throw err ;
52+ } ) ;
1753
1854console . log ( conferences ) ;
1955
20- conferences . onData ( list => {
21- console . log ( list ) ;
22- } ) ;
23-
24- console . log ( 'end' ) ;
56+ conferences . resolve ( [ 'Tehran' , 'Yalta' , 'Potsdam' ] ) ;
57+ conferences . reject ( new Error ( 'Never occurs' ) ) ;
You can’t perform that action at this time.
0 commit comments