2121import elemental2 .promise .Promise .PromiseExecutorCallbackFn .RejectCallbackFn ;
2222import elemental2 .promise .Promise .PromiseExecutorCallbackFn .ResolveCallbackFn ;
2323
24- import static elemental2 .dom .DomGlobal .clearInterval ;
2524import static elemental2 .dom .DomGlobal .clearTimeout ;
26- import static elemental2 .dom .DomGlobal .setInterval ;
2725import static elemental2 .dom .DomGlobal .setTimeout ;
2826
2927class RepeatImpl <C extends FlowContext > extends FlowRunner <C > implements Repeat <C > {
3028
3129 private final Task <C > task ;
3230 private Predicate <C > predicate ;
31+ private boolean finished ;
3332 private boolean failFast ;
3433 private long interval ;
3534 private long timeout ;
@@ -43,6 +42,7 @@ class RepeatImpl<C extends FlowContext> extends FlowRunner<C> implements Repeat<
4342 super (context , 1 );
4443 this .task = task ;
4544 this .predicate = __ -> true ;
45+ this .finished = false ;
4646 this .failFast = DEFAULT_FAIL_FAST ;
4747 this .interval = DEFAULT_INTERVAL ;
4848 this .timeout = DEFAULT_TIMEOUT ;
@@ -99,7 +99,7 @@ Promise<C> run() {
9999 }
100100
101101 private void until (ResolveCallbackFn <C > resolve , RejectCallbackFn reject ) {
102- intervalHandle = setInterval ( __ -> {
102+ if (! finished ) {
103103 if (failFast && lastFailure != null ) {
104104 cancel (reject , lastFailure );
105105 } else {
@@ -110,6 +110,11 @@ private void until(ResolveCallbackFn<C> resolve, RejectCallbackFn reject) {
110110 if (areWeDone (c )) {
111111 finish (resolve , c );
112112 }
113+ if (interval != 0 ) {
114+ intervalHandle = setTimeout (__ -> until (resolve , reject ), interval );
115+ } else {
116+ until (resolve , reject );
117+ }
113118 return null ;
114119 })
115120 .catch_ (error -> {
@@ -120,7 +125,7 @@ private void until(ResolveCallbackFn<C> resolve, RejectCallbackFn reject) {
120125 return null ;
121126 });
122127 }
123- }, interval );
128+ }
124129 }
125130
126131 // ------------------------------------------------------ helper methods
@@ -134,6 +139,7 @@ private boolean areWeDone(C context) {
134139 }
135140
136141 private void finish (ResolveCallbackFn <C > resolve , C context ) {
142+ finished = true ;
137143 cleanup ();
138144 context .progress .finish ();
139145 resolve .onInvoke (context );
@@ -145,7 +151,7 @@ private void cancel(RejectCallbackFn reject, String reason) {
145151 }
146152
147153 private void cleanup () {
148- clearInterval (intervalHandle );
154+ clearTimeout (intervalHandle );
149155 clearTimeout (timeoutHandle );
150156 }
151157}
0 commit comments