function deferred() { let resolve const promise = new Promise(f => { resolve = f }) return { promise, resolve } } let it, a, b, c let getterHit = 0 let inGetter = false Object.defineProperty(Object.prototype, "then", { configurable: true, get() { if (inGetter || !it) return undefined inGetter = true try { if (getterHit === 0) { it.return(0) } else if (getterHit === 1) { it.next(1) it.return(1) } getterHit++ } catch (_) { } inGetter = false return undefined }, }) async function* g() { try { await a.promise yield 1 await b.promise yield 2 await c.promise } finally { await c.promise } } (async () => { a = deferred() b = deferred() c = deferred() it = g() it.next() a.resolve({}) await Promise.resolve() await Promise.resolve() b.resolve({}) c.resolve({}) await Promise.resolve() })()