I'm confused by interaction of Rust async and JS async when dealing with Chrome/wasm32.
Is it correct to say:
-
Rust asyncs are "lazy" in that we have to await on them for them to do work.
-
JS asyncs are "eager" in that from the moment they are created, they start doing work, even if we do not await on them.
Yes, a Rust future doesn't do anything until it's polled and a JS Promise is scheduled basically immediately on creation.
1 Like
More precisely, a JS Promise is not scheduled at all; it is only a handle to the output of something that will or won't complete on its own.
1 Like
Does this imply that anything that crosses the JS <-> Rust border, in either direction, is eager?
For JS Promise -> Rust async: it's eager because the JS Promise is eager
For Rust async -> JS promise: We create + schedule JS promise. This polls the Rust async. Thus eager.
Is this logic correct ?
Nothing makes Rust Futures eager, you always have to poll them to make progress. If you pass a future to something that polls it when a JS task completes you haven't made the Rust Future eager, something else is just doing the polling.
1 Like