//svetofor const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms)) async function trafficLight(element, timeGreen, timeYellow, timeRed){ while (true){ element.style.backgroundColor = 'green' await delay(timeGreen) element.style.backgroundColor = 'yellow' await delay(timeYellow) element.style.backgroundColor = 'red' await delay(timeRed) } } //domEventPromise function domEventPromise(element, eventName) { return new Promise((resolve) => { element.addEventListener(eventName, function toDelete (e) { element.removeEventListener(eventName, toDelete) resolve(e) }) }) } //PedestrianTrafficLight function changeColor(element, color) { element.style.backgroundColor = color } async function pedestrianTrafficLight(element, element2, timeGreen, timeYellow, timeRed) { while(true) { delay(timeGreen / 3).then(() => btn.disabled = false) changeColor(element, 'green') changeColor(element2, 'red') await Promise.race([delay(timeGreen), domEventPromise(btn, 'click')]) btn.disabled = true changeColor(element, 'yellow') await delay(timeYellow) changeColor(element, 'red') changeColor(element2, 'green') await delay(timeRed) changeColor(element, 'yellow') changeColor(element2, 'red') await delay(timeYellow) } } pedestrianTrafficLight(trafficLightContainer, pedestrianTrafficLightContainer, 10000, 3000, 15000) //speedtest async function speedtest(getPromise, count, parallel=1){ let startTime = performance.now() for (let i = 0; i < count; i++) { let promises = [] for (let j = 0; j < parallel; j++) { promises.push(getPromise()) } await Promise.all(promises) } let duration = performance.now() - startTime let querySpeed = count / duration let queryDuration = duration / count let parallelSpeed = (count * parallel) / duration let parallelDuration = duration / (count * parallel) return { duration, querySpeed, queryDuration, parallelSpeed, parallelDuration } } speedtest(() => delay(1000), 10, 10 ).then(result => console.log(result)) speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 3, 1).then(result => console.log(result)) // async function newTrafficLight(element, timeGreen, timeYellow, timeRed) { // async function trafficLightImproved(){ // while (a){ // element.style.backgroundColor = 'green' // if (!a) break // await delay(timeGreen) // element.style.backgroundColor = 'yellow' // if (!a) break // await delay(timeYellow) // element.style.backgroundColor = 'red' // if (!a) break // await delay(timeRed) // } // } // let a = true; // // btn.onclick = async () => { // // a = false; // // await delay(3000) // // a = true; // // trafficLightImproved() // // } // trafficLightImproved() // while (true) { // await domEventPromise(btn, 'click').then(e => console.log('event click happens', e)) // .then(async () => { // a = false // await delay(1000) // a = true // trafficLightImproved() // }) // await delay(5000) // } // } // newTrafficLight(document.body, 5000, 2000, 5000)