@@ -3,13 +3,15 @@ import { useAsyncCallback } from "../../lib/use-async-effect";
3
3
import { CPromise } from "c-promise2" ;
4
4
5
5
function TestComponent ( props ) {
6
- const [ combine , setCombine ] = useState ( false ) ;
7
- const [ cancelPrevious , setCancelPrevious ] = useState ( false ) ;
8
- const [ randomDelay , setRandomDelay ] = useState ( false ) ;
9
- const [ list , setList ] = useState ( [ ] ) ;
6
+ const [ combine , setCombine ] = useState ( false ) ;
7
+ const [ cancelPrevious , setCancelPrevious ] = useState ( false ) ;
8
+ const [ randomDelay , setRandomDelay ] = useState ( false ) ;
9
+ const [ queueSize , setQueueSize ] = useState ( - 1 ) ;
10
+ const [ list , setList ] = useState ( [ ] ) ;
10
11
11
12
const [ callback , cancel , pending , done , result , err ] = useAsyncCallback (
12
13
function * ( ...args ) {
14
+ this . timeout ( props . timeout ) ;
13
15
console . log ( `start [${ args } ]` ) ;
14
16
yield CPromise . delay ( randomDelay ? 2000 + Math . random ( ) * 5000 : 4000 ) ;
15
17
if ( args [ 1 ] ) {
@@ -18,46 +20,57 @@ function TestComponent(props) {
18
20
console . log ( `end [${ args } ]` ) ;
19
21
return new Date ( ) . toLocaleTimeString ( ) ;
20
22
} ,
21
- { states : true , deps : [ props . url , combine , cancelPrevious , randomDelay ] , combine, cancelPrevious}
23
+ {
24
+ states : true ,
25
+ deps : [ props . url , combine , cancelPrevious , randomDelay , queueSize ] ,
26
+ combine,
27
+ cancelPrevious,
28
+ queueSize
29
+ }
22
30
) ;
23
31
24
- const pushTask = ( ...args ) => {
25
- const promise = callback ( ...args ) . catch ( err => {
26
- setList ( list => list . map ( item => item . task === promise ? {
27
- ...item ,
28
- title : `Task with [${ args } ] argument failed ${ err . toString ( ) } ` ,
29
- err
30
- } : item ) ) ;
31
- return CPromise . delay ( 2000 ) ;
32
- } ) . then ( ( ) => {
33
- setList ( ( list ) => list . filter ( entry => promise !== entry . task ) )
34
- } )
35
- setList ( list => [ ...list , {
36
- title : `Task with [${ args } ] argument queued at ${ new Date ( ) . toLocaleTimeString ( ) } ` ,
37
- arg : args ,
38
- task : promise
39
- } ] )
40
- }
32
+ const pushTask = ( ...args ) => {
33
+ const promise = callback ( ...args )
34
+ . catch ( ( err ) => {
35
+ setList ( ( list ) =>
36
+ list . map ( ( item ) =>
37
+ item . task === promise
38
+ ? {
39
+ ...item ,
40
+ title : `Task with [${ args } ] argument failed ${ err . toString ( ) } ` ,
41
+ err
42
+ }
43
+ : item
44
+ )
45
+ ) ;
46
+ return CPromise . delay ( 3000 ) ;
47
+ } )
48
+ . then ( ( ) => {
49
+ setList ( ( list ) => list . filter ( ( entry ) => promise !== entry . task ) ) ;
50
+ } ) ;
51
+ setList ( ( list ) => [
52
+ ...list ,
53
+ {
54
+ title : `Task with [${ args } ] argument queued at ${ new Date ( ) . toLocaleTimeString ( ) } ` ,
55
+ arg : args ,
56
+ task : promise
57
+ }
58
+ ] ) ;
59
+ } ;
41
60
42
61
return (
43
62
< div className = "component" >
44
63
< div className = "caption" > useAsyncCallback combine demo:</ div >
45
64
< div >
46
- { done ? (
47
- err ? (
48
- err . toString ( )
49
- ) : (
50
- result
51
- )
52
- ) : (
53
- pending ? 'pending...' : ''
54
- ) }
65
+ { done ? ( err ? err . toString ( ) : result ) : pending ? "pending..." : "" }
55
66
</ div >
56
- < button onClick = { ( ) => pushTask ( '🍊' ) } > Make a call with 🍊</ button >
57
- < button onClick = { ( ) => pushTask ( '🍓' ) } > Make a call with 🍓</ button >
58
- < button onClick = { ( ) => pushTask ( '🍏' ) } > Make a call with 🍏</ button >
59
- < button onClick = { ( ) => pushTask ( '🍑' ) } > Make a call with 🍑</ button >
60
- < button onClick = { ( ) => pushTask ( '🍇' , new Error ( 'my error' ) ) } > Make a call with 🍇 that will fail after 4000ms</ button >
67
+ < button onClick = { ( ) => pushTask ( "🍊" ) } > Make a call with 🍊</ button >
68
+ < button onClick = { ( ) => pushTask ( "🍓" ) } > Make a call with 🍓</ button >
69
+ < button onClick = { ( ) => pushTask ( "🍏" ) } > Make a call with 🍏</ button >
70
+ < button onClick = { ( ) => pushTask ( "🍑" ) } > Make a call with 🍑</ button >
71
+ < button onClick = { ( ) => pushTask ( "🍇" , new Error ( "my error" ) ) } >
72
+ Make a call with 🍇 that will fail after 4000ms
73
+ </ button >
61
74
< button className = "btn btn-danger" onClick = { cancel } disabled = { ! pending } >
62
75
Cancel all running calls
63
76
</ button >
@@ -67,37 +80,68 @@ function TestComponent(props) {
67
80
< li >
68
81
< label >
69
82
combine
70
- < input type = "checkbox" onChange = { ( { target} ) => setCombine ( target . checked ) } />
83
+ < input
84
+ type = "checkbox"
85
+ onChange = { ( { target } ) => setCombine ( target . checked ) }
86
+ />
71
87
</ label >
72
88
</ li >
73
89
< li >
74
90
< label >
75
91
cancelPrevious
76
- < input type = "checkbox" onChange = { ( { target} ) => setCancelPrevious ( target . checked ) } />
92
+ < input
93
+ type = "checkbox"
94
+ onChange = { ( { target } ) => setCancelPrevious ( target . checked ) }
95
+ />
96
+ </ label >
97
+ </ li >
98
+ < li >
99
+ < label >
100
+ Queue size:
101
+ < input
102
+ type = "number"
103
+ min = "-1"
104
+ max = "100"
105
+ value = { queueSize }
106
+ step = "1"
107
+ onChange = { ( { target } ) => setQueueSize ( target . value * 1 ) }
108
+ />
77
109
</ label >
78
110
</ li >
79
111
< li >
80
112
< label >
81
113
use random delay for tasks
82
- < input type = "checkbox" onChange = { ( { target} ) => setRandomDelay ( target . checked ) } />
114
+ < input
115
+ type = "checkbox"
116
+ onChange = { ( { target } ) => setRandomDelay ( target . checked ) }
117
+ />
83
118
</ label >
84
119
</ li >
85
120
</ ul >
86
121
</ div >
87
122
< div >
88
123
Requested calls [{ list . length } ]:
89
124
< ul >
90
- { list . map ( ( { title, err, task} ) => < li style = { { color : err && 'red' } } > { title }
91
- { ! err && < button onClick = { ( ) => {
92
- task . cancel ( ) ;
93
- } } > ❌</ button > }
94
- </ li > ) }
125
+ { list . map ( ( { title, err, task } ) => (
126
+ < li style = { { color : err && "red" } } >
127
+ { title }
128
+ { ! err && (
129
+ < button
130
+ onClick = { ( ) => {
131
+ task . cancel ( ) ;
132
+ } }
133
+ >
134
+ ❌
135
+ </ button >
136
+ ) }
137
+ </ li >
138
+ ) ) }
95
139
</ ul >
96
140
</ div >
97
-
98
141
</ div >
99
142
) ;
100
143
}
101
144
102
145
export default TestComponent ;
103
146
147
+
0 commit comments