Unify async macro and futures for js and native targets

This commit is contained in:
Yuriy Glukhov
2018-01-03 21:47:59 +02:00
parent 67ac1aef59
commit c93655e8b4
7 changed files with 43 additions and 4 deletions

View File

@@ -24,6 +24,7 @@ environment:
# platform: x86
install:
- ps: Install-Product node 8 # node 8 or later is required to test js async stuff
- MKDIR %CD%\DIST
- MKDIR %CD%\DIST\PCRE
- nuget install pcre -Verbosity quiet -Version 8.33.0.1 -OutputDirectory %CD%\DIST\PCRE

View File

@@ -139,3 +139,7 @@ macro async*(arg: untyped): untyped =
proc newPromise*[T](handler: proc(resolve: proc(response: T))): Future[T] {.importcpp: "(new Promise(#))".}
## A helper for wrapping callback-based functions
## into promises and async procedures
proc newPromise*(handler: proc(resolve: proc())): Future[void] {.importcpp: "(new Promise(#))".}
## A helper for wrapping callback-based functions
## into promises and async procedures

6
lib/pure/async.nim Normal file
View File

@@ -0,0 +1,6 @@
when defined(js):
import asyncjs
export asyncjs
else:
import asyncmacro, asyncfutures
export asyncmacro, asyncfutures

View File

@@ -1,2 +0,0 @@
when defined(upcoming):
patchFile("stdlib", "asyncdispatch", "$lib/upcoming/asyncdispatch")

View File

@@ -0,0 +1,30 @@
discard """
output: '''hi
bye'''
"""
import async, times
when defined(js):
proc sleepAsync(t: int): Future[void] =
var promise = newPromise() do(resolve: proc()):
{.emit: """
setTimeout(function(){
`resolve`();
}, `t`);
""".}
result = promise
else:
from asyncdispatch import sleepAsync, waitFor
proc foo() {.async.} =
echo "hi"
var s = epochTime()
await sleepAsync(500)
var e = epochTime()
doAssert(e - s > 0.1)
echo "bye"
when defined(js):
discard foo()
else:
waitFor foo()

View File

@@ -1,5 +1,4 @@
discard """
disabled: true
output: '''
x
e

View File

@@ -225,7 +225,8 @@ proc jsTests(r: var TResults, cat: Category, options: string) =
"actiontable/tactiontable", "method/tmultim1",
"method/tmultim3", "method/tmultim4",
"varres/tvarres0", "varres/tvarres3", "varres/tvarres4",
"varres/tvartup", "misc/tints", "misc/tunsignedinc"]:
"varres/tvartup", "misc/tints", "misc/tunsignedinc",
"async/tjsandnativeasync"]:
test "tests/" & testfile & ".nim"
for testfile in ["strutils", "json", "random", "times", "logging"]: