1
1
import { removeQueueNumber , addPrime , addNonPrime } from '../actions/primes' ;
2
2
3
- export const CHECK_NEXT_PRIME = 'CHECK_NEXT_PRIME' ;
3
+ export const CHECK_PRIMES = 'CHECK_PRIMES' ;
4
+
5
+ let workers = { } ;
4
6
5
7
function createPrimesMiddleware ( ) {
6
8
return ( store ) => ( next ) => ( action ) => {
7
9
8
10
switch ( action . type ) {
9
- case CHECK_NEXT_PRIME :
11
+ case CHECK_PRIMES :
10
12
const { queue } = store . getState ( ) . primeState ;
11
- checkNextPrime ( queue , store . dispatch ) ;
13
+ checkPrimes ( queue , store . dispatch ) ;
12
14
return true ;
13
15
default :
14
16
return next ( action ) ;
15
17
}
16
18
} ;
17
19
}
18
20
19
- function checkNextPrime ( queue , dispatch ) {
21
+ function checkPrimes ( queue , dispatch ) {
20
22
if ( queue . length > 0 ) {
21
- const number = queue [ 0 ] ;
22
- console . log ( 'checking next number ' + number ) ;
23
- checkPrime ( number ) . then (
24
- ( isPrime ) => {
25
- dispatch ( removeQueueNumber ( number ) ) ;
26
- if ( isPrime ) {
27
- console . log ( 'number ' + number + ' is prime!' ) ;
28
- dispatch ( addPrime ( number ) ) ;
29
- } else {
30
- console . log ( 'number ' + number + ' is not prime!' ) ;
31
- dispatch ( addNonPrime ( number ) ) ;
32
- }
23
+
24
+ queue . forEach ( ( number ) => {
25
+ if ( ! workers [ number ] ) {
26
+ console . log ( 'checking number ' + number ) ;
27
+ checkPrime ( number ) . then (
28
+ ( isPrime ) => {
29
+ dispatch ( removeQueueNumber ( number ) ) ;
30
+ if ( isPrime ) {
31
+ console . log ( 'number ' + number + ' is prime!' ) ;
32
+ dispatch ( addPrime ( number ) ) ;
33
+ } else {
34
+ console . log ( 'number ' + number + ' is not prime!' ) ;
35
+ dispatch ( addNonPrime ( number ) ) ;
36
+ }
37
+ }
38
+ ) ;
33
39
}
34
- ) ;
40
+ } ) ;
41
+
42
+ const number = queue [ 0 ] ;
35
43
}
36
44
}
37
45
@@ -41,23 +49,24 @@ function checkPrime( number ) {
41
49
( resolve , reject ) => {
42
50
// Create a worker to do the actual mathematical operations.
43
51
const worker = new Worker ( '/static/worker-primes.js' ) ;
52
+ workers [ number ] = worker ;
53
+ console . log ( 'Worker created' ) ;
54
+ console . log ( worker ) ;
44
55
45
56
worker . onmessage = function ( evt ) {
46
57
console . log ( 'message received from worker.' ) ;
47
58
console . log ( evt ) ;
59
+ delete workers [ number ] ;
48
60
resolve ( evt . data ) ;
49
61
}
50
62
51
- console . log ( 'Worker created' ) ;
52
- console . log ( worker ) ;
53
-
54
63
worker . postMessage ( Number ( number ) ) ;
55
64
}
56
65
) ;
57
66
}
58
67
59
- export function checkNextPrimeAction ( ) {
60
- return { type : CHECK_NEXT_PRIME } ;
68
+ export function checkPrimesAction ( ) {
69
+ return { type : CHECK_PRIMES } ;
61
70
}
62
71
63
72
export default createPrimesMiddleware ;
0 commit comments