diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2016-09-17 14:19:26 +0200 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@gmail.com> | 2016-09-17 14:19:26 +0200 |
commit | 75e5c87f1525d5c5ea59005bc458ff6f561a27c9 (patch) | |
tree | a9d84d4f572bf773a855029496d3acb388592b00 /lib/upcoming | |
parent | 5bf16439e1eddb93b4c9177530ca6640a32de42b (diff) | |
download | Nim-75e5c87f1525d5c5ea59005bc458ff6f561a27c9.tar.gz |
Fixes #4170.
Diffstat (limited to 'lib/upcoming')
-rw-r--r-- | lib/upcoming/asyncdispatch.nim | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/upcoming/asyncdispatch.nim b/lib/upcoming/asyncdispatch.nim index 689d0272c..460dfbd1a 100644 --- a/lib/upcoming/asyncdispatch.nim +++ b/lib/upcoming/asyncdispatch.nim @@ -339,17 +339,22 @@ proc `and`*[T, Y](fut1: Future[T], fut2: Future[Y]): Future[void] = var retFuture = newFuture[void]("asyncdispatch.`and`") fut1.callback = proc () = - if fut2.finished: retFuture.complete() + if not retFuture.finished: + if fut1.failed: retFuture.fail(fut1.error) + elif fut2.finished: retFuture.complete() fut2.callback = proc () = - if fut1.finished: retFuture.complete() + if not retFuture.finished: + if fut2.failed: retFuture.fail(fut2.error) + elif fut1.finished: retFuture.complete() return retFuture proc `or`*[T, Y](fut1: Future[T], fut2: Future[Y]): Future[void] = ## Returns a future which will complete once either ``fut1`` or ``fut2`` ## complete. var retFuture = newFuture[void]("asyncdispatch.`or`") - proc cb() = + proc cb(fut: Future[T]) = + if fut.failed: retFuture.fail(fut.error) if not retFuture.finished: retFuture.complete() fut1.callback = cb fut2.callback = cb @@ -374,10 +379,13 @@ proc all*[T](futs: varargs[Future[T]]): auto = for fut in futs: fut.callback = proc(f: Future[T]) = - inc(completedFutures) + if f.failed: + retFuture.fail(f.error) + elif not retFuture.finished: + inc(completedFutures) - if completedFutures == totalFutures: - retFuture.complete() + if completedFutures == totalFutures: + retFuture.complete() return retFuture @@ -390,11 +398,14 @@ proc all*[T](futs: varargs[Future[T]]): auto = for i, fut in futs: proc setCallback(i: int) = fut.callback = proc(f: Future[T]) = - retValues[i] = f.read() - inc(completedFutures) - - if completedFutures == len(retValues): - retFuture.complete(retValues) + if f.failed: + retFuture.fail(f.error) + elif not retFuture.finished: + retValues[i] = f.read() + inc(completedFutures) + + if completedFutures == len(retValues): + retFuture.complete(retValues) setCallback(i) |