// Note, doesn't deal with timeouts, infinite recursion, errors etc.. async function resolveAll(render, promiseTracker) { const renderResult = render(promiseTracker) if (promiseTracker.hasWork) { await promiseTracker.waitForCompletion() return resolveAll(render, promiseTracker) } return renderResult } // And finally we can use it: resolveAll(() => ReactDOM.renderToString(), new PromiseTracker())