JSFiddle - React, Tailwind, and code Playground

by dušan roštár

HTML

<button id="resolve">click to resolve</button>
<br><br>
<button id="reject">click to reject</button>
<br><br>
<button id="fn">click for sync fn</button>

JavaScript

const AsyncFunction = Object.getPrototypeOf(async function () { }).constructor;
  
function awaitFromString(handler) {
	return new Promise((resolve, reject) => {
  	new AsyncFunction('resolve', 'reject', `try { await ${handler}; resolve(); } catch (e) { reject(e); }`)(resolve, reject);
  });
}

document.getElementById('resolve').addEventListener('click', async () => {
await awaitFromString("setTimeout(() => { console.log('Delayed for 1 second.'); }, 1000)") });

document.getElementById('reject').addEventListener('click', async () => {
await awaitFromString("setTimeout(() => { throw new Error('something happened') }, 1000)") });

document.getElementById('fn').addEventListener('click', async () => {
await awaitFromString("console.log('hi from standard good old fn');") });