diff --git a/README.md b/README.md index d045dcc..a0d904d 100755 --- a/README.md +++ b/README.md @@ -149,6 +149,39 @@ An @async function's return type will also be transformed. The following functio } ``` +## JS Promises + +When `@await` is used on an expression that is a JS Promise, `tink_await` will extract the `T` from `js.lib.Promise` (if it is a `js.lib.Promise`) and wrap the expression in a check-type statement: +`($expr : tink.core.Promise)`. + +This will leverage the magic of `tink_core` to silently convert the JS promise into a tink promise. + +```haxe +var secret = @:await new SecretManagerServiceClient({ + credentials: { + client_email: 'test', + private_key: 'test' + } + }).accessSecretVersion({ + name: 'test' + }); +``` +Becomes: +```haxe +var secret = @:await (new SecretManagerServiceClient({ + credentials: { + client_email: 'test', + private_key: 'test' + } + }) : tink.core.Promise, Null<{}>>> +).accessSecretVersion({ + name: 'test' + }); +``` + +Try typing that 10 times quickly. + + ## Flags - `-D await_catch_none`: Unexpected exceptions are never caught. diff --git a/src/tink/await/AsyncField.hx b/src/tink/await/AsyncField.hx index d1f6cd3..2640d70 100644 --- a/src/tink/await/AsyncField.hx +++ b/src/tink/await/AsyncField.hx @@ -203,7 +203,7 @@ class AsyncField { var tmp = tmpVar(); return function() return process(em, ctx, function(transformed) return function() return macro @:pos(em.pos) - $transformed.handle(${handler(tmp, ctx, next)}) + tink.core.Promise.lift($transformed).handle(${handler(tmp, ctx, next)}) ); case EFor(it, expr): if (!hasAwait(expr)) {