The following snippet works in Chrome: (async () => { var i = document.createElement('iframe'); document.body.appendChild(i); var a = i.contentWindow.eval('(async () => await 1)'); i.remove(); // someone removes the iframe const v = await a(); console.log(v); })(); Our use case has code that works when wired up and then someone removes the iframe and `await` no longer resolves.
<rdar://problem/68367353>
This might be a Chrome bug per spec, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1663090#c3 (Though I haven't double-checked)
Currently, what we should do is not fully clarified in the spec. It is ongoing discussion. But I think forever-pending promise would make sense since we should stop execution of script, and rejecting promise can involve script execution. https://github.com/whatwg/html/issues/2621