If you try to use the async API, it's a challenge today. The API provides a synchronous tree traversal function (forEachChild), but pulling on semantic information is asynchronous.
The problem isn't the mixture itself - it's that forEachChild stops walking when the visitor function returns a truthy result. This makes it impractical to use with async APIs because every async function returns a Promise which is truthy.
The current workarounds are a little awkward, basically introducing a layer of indirection between the traversal function and forEachChild that uses intermediate queues.
I'm not sure if there's an ideal solution - there's at least two problems right now:
- it feels like we could benefit from a
forEachChildAsync or something like that.
- using
forEachChild is a foot-gun if you've decided to use the async API.
If you try to use the async API, it's a challenge today. The API provides a synchronous tree traversal function (
forEachChild), but pulling on semantic information is asynchronous.The problem isn't the mixture itself - it's that
forEachChildstops walking when the visitor function returns a truthy result. This makes it impractical to use with async APIs because every async function returns aPromisewhich is truthy.The current workarounds are a little awkward, basically introducing a layer of indirection between the traversal function and
forEachChildthat uses intermediate queues.I'm not sure if there's an ideal solution - there's at least two problems right now:
forEachChildAsyncor something like that.forEachChildis a foot-gun if you've decided to use the async API.