pedestrianTrafficLight.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // PedestrianTrafficLight
  2. // -------------УСЛОВИЕ-------------
  3. // Напишите упрощенный светофор для пешеходов
  4. // Stage 2
  5. // Используя Promise.race, domEventPromise и кнопку в DOM сделайте пешеходный светофор с кнопкой, который также переключается по времени периодически.
  6. // Stage 3
  7. // Не давайте возможности пешеходам сильно наглеть - предусмотрите задержку, после которой будет работать кнопка.
  8. // -------------РЕШЕНИЕ-------------
  9. const pedColors = ['red', 'green'];
  10. function pedsTrafficLights() {
  11. const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
  12. const domEventPromise = (knopka, eventName, time, pedDelay) => new Promise((resolve, reject) => {
  13. async function promiseResolve(e) {
  14. knopka.removeEventListener(eventName, promiseResolve);
  15. await delay(pedDelay);
  16. resolve(e)
  17. };
  18. async function listener() {
  19. knopka.addEventListener(eventName, promiseResolve);
  20. await delay(time);
  21. reject(knopka.removeEventListener(eventName, promiseResolve));
  22. }
  23. listener();
  24. });
  25. async function trafficLight(root, colors, greenTime, redTime, pedDelay) {
  26. root.innerHTML = colors.map(color => ` <div id=${color+'Ped'} class='lightColor'></div> `).join('');
  27. while (true) {
  28. for (let color of colors) {
  29. eval(color+'Ped').classList.toggle('on');
  30. await Promise.race([delay(eval(`${color}Time`)), domEventPromise(switchBtnPed, 'click', eval(`${color}Time`), pedDelay).then(e => console.log('event click happens', e))]);
  31. eval(color+'Ped').classList.toggle('on');
  32. }
  33. }
  34. }
  35. trafficLight(rootPed, pedColors, 5000, 4000, 1000);
  36. };
  37. pedsTrafficLights(rootPed, pedColors);