const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms)) let div = document.createElement('div') document.body.append(div) //domEventPromise let btn = document.createElement('button') btn.innerText = 'click' document.body.append(btn) function domEventPromise(elem, eventName) { let prom = new Promise((resolve, reject) => { function doAndRemove(event) { elem.removeEventListener(eventName, doAndRemove) resolve(event) } elem.addEventListener(eventName, doAndRemove) }) return prom } domEventPromise(btn, 'click').then((event) => console.log('event click happens', event)) async function pedestrianTrafficLight(parent, redTime = 4000, yellowTime = 2000, greenTime = 2000) { let container = document.createElement('div') container.style.backgroundColor = 'grey' container.style.width = 'fit-content' container.style.padding = '5px' let btn = document.createElement('button') btn.innerText = 'pedestrian button' let colors = [] for(let i = 0; i < 3; i++) { let color = document.createElement('div') color.style.backgroundColor = 'black' color.style.width = '100px' color.style.height = '100px' color.style.borderRadius = '100%' color.style.margin = '10px' container.append(color) colors.push(color) } container.append(btn) parent.append(container) while (true) { let pressed = false btn.disabled = false switch ('red') { case 'red': colors[0].style.backgroundColor = 'red' colors[0].style.boxShadow = '0px 2px 10px red' await Promise.race([delay(redTime), domEventPromise(btn, 'click')]).then((e) => { if (typeof e === 'object') { pressed = true } }) colors[0].style.boxShadow = 'none' colors[0].style.backgroundColor = 'black' case 'yellow': if (pressed === true) break; colors[1].style.backgroundColor = 'yellow' colors[1].style.boxShadow = '0px 2px 10px yellow' await Promise.race([delay(yellowTime), domEventPromise(btn, 'click')]).then((e) => { if (typeof e === 'object') { pressed = true } }) colors[1].style.boxShadow = 'none' colors[1].style.backgroundColor = 'black' } colors[2].style.backgroundColor = 'lightgreen' colors[2].style.boxShadow = '0px 2px 10px lightgreen' btn.disabled = true await delay(greenTime) colors[2].style.boxShadow = 'none' colors[2].style.backgroundColor = 'black' } } pedestrianTrafficLight(div, 3000, 3000, 3000) // speedtest async function speedtest(getPromise, count,parallel=1){ let _parallel = parallel let duration = performance.now() for(let i = 0; i < count; i++) { let promises = [] while(parallel !== 0) { promises.push(await getPromise()) parallel -= 1 } Promise.all(promises) } duration = performance.now() - duration return { duration: duration, querySpeed: count / duration, queryDuration: duration / count, parallelSpeed: (count * _parallel) / (duration / count), parallelDuration: duration / (count * _parallel) } } speedtest(() => delay(1000), 10, 10 ).then(result => console.log('result',result)) speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 10, 5).then(result => console.log('result',result))