|
@@ -0,0 +1,64 @@
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ const colors = ['red', 'yellow', 'green', 'yellow'];
|
|
|
+function vehiclesTrafficLights() {
|
|
|
+ const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ const domEventPromise = (knopka, eventName, time) => new Promise((resolve, reject) => {
|
|
|
+ const promiseResolve = (e) => { knopka.removeEventListener(eventName, promiseResolve); resolve(e) };
|
|
|
+ async function listener() {
|
|
|
+ knopka.addEventListener(eventName, promiseResolve);
|
|
|
+ await delay(time);
|
|
|
+ reject(knopka.removeEventListener(eventName, promiseResolve));
|
|
|
+ }
|
|
|
+ listener();
|
|
|
+ });
|
|
|
+
|
|
|
+ async function trafficLight(root, colors, greenTime, yellowTime, redTime) {
|
|
|
+ const colorsNew = colors.slice(0, colors.length - 1);
|
|
|
+ root.innerHTML = colorsNew.map(color => ` <div id=${color} class='lightColor'></div> `).join('');
|
|
|
+
|
|
|
+ while (true) {
|
|
|
+ for (let color of colors) {
|
|
|
+ eval(color).classList.toggle('on');
|
|
|
+
|
|
|
+ await Promise.race([delay(eval(`${color}Time`)), domEventPromise(switchBtn, 'click', eval(`${color}Time`)).then(e => console.log('event click happens', e))]);
|
|
|
+ eval(color).classList.toggle('on');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ trafficLight(root, colors, 5000, 3000, 5000);
|
|
|
+};
|
|
|
+vehiclesTrafficLights(root, colors);
|