123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 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))
|