1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- discard """
- output: '''
- x
- e
- done
- '''
- """
- #[
- xxx move this to tests/stdlib/tasyncjs.nim
- ]#
- import std/asyncjs
- block:
- # demonstrate forward definition for js
- proc y(e: int): Future[string] {.async.}
- proc e: int {.discardable.} =
- echo "e"
- return 2
- proc x(e: int): Future[void] {.async.} =
- var s = await y(e)
- if e > 2:
- return
- echo s
- e()
- proc y(e: int): Future[string] {.async.} =
- if e > 0:
- return await y(0)
- else:
- return "x"
- discard x(2)
- import std/sugar
- from std/strutils import contains
- var witness: seq[string]
- proc fn(n: int): Future[int] {.async.} =
- if n >= 7:
- raise newException(ValueError, "foobar: " & $n)
- if n > 0:
- var ret = 1 + await fn(n-1)
- witness.add $(n, ret)
- return ret
- else:
- return 10
- proc asyncFact(n: int): Future[int] {.async.} =
- if n > 0: result = n * await asyncFact(n-1)
- else: result = 1
- proc asyncIdentity(n: int): Future[int] {.async.} =
- if n > 0: result = 1 + await asyncIdentity(n-1)
- else: result = 0
- proc main() {.async.} =
- block: # then
- let x = await fn(4)
- .then((a: int) => a.float)
- .then((a: float) => $a)
- doAssert x == "14.0"
- doAssert witness == @["(1, 11)", "(2, 12)", "(3, 13)", "(4, 14)"]
- doAssert (await fn(2)) == 12
- let x2 = await fn(4).then((a: int) => (discard)).then(() => 13)
- doAssert x2 == 13
- let x4 = await asyncFact(3).then(asyncIdentity).then(asyncIdentity).then((a:int) => a * 7).then(asyncIdentity)
- doAssert x4 == 3 * 2 * 7
- block: # bug #17177
- proc asyncIdentityNested(n: int): Future[int] {.async.} = return n
- let x5 = await asyncFact(3).then(asyncIdentityNested)
- doAssert x5 == 3 * 2
- when false: # xxx pending bug #17254
- let x6 = await asyncFact(3).then((a:int) {.async.} => a * 11)
- doAssert x6 == 3 * 2 * 11
- block: # catch
- var reason: Error
- await fn(6).then((a: int) => (witness.add $a)).catch((r: Error) => (reason = r))
- doAssert reason == nil
- await fn(7).then((a: int) => (discard)).catch((r: Error) => (reason = r))
- doAssert reason != nil
- doAssert reason.name == "Error"
- doAssert "foobar: 7" in $reason.message
- echo "done" # justified here to make sure we're running this, since it's inside `async`
- discard main()
|