trafficLight.js 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // Async / Await Homework 2
  2. // -------------УСЛОВИЕ-------------
  3. // Светофор
  4. // Используя асинхронную функцию и бесконечный цикл, просимулируйте светофор:
  5. // const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
  6. // async function trafficLight(){
  7. // while (true){
  8. // включаем зеленый
  9. // await delay(время зеленого)
  10. // включаем желтый
  11. // await delay(время желтого)
  12. // включаем красный
  13. // await delay(время красного)
  14. // }
  15. // }
  16. // Для отображения включения того или иного света используйте один или три DOM-элемента.
  17. // Stage 2
  18. // Сделайте trafficLight более универсальной - добавьте в параметры DOM-элемент для отображения, а также время работы каждого цвета
  19. // domEventPromise
  20. // Реализуйте промисифицированную функцию, которая резолвит промис по событию в DOM:
  21. // domEventPromise(knopka, 'click').then( e => console.log('event click happens', e))
  22. // Функция должна:
  23. // используя addEventListener повесить свой обработчик события на DOM element событие eventName
  24. // по событию зарезолвить промис отдав в качестве результата объект события
  25. // убрать обработчик с DOM-элемента, используя removeEventListener
  26. // -------------РЕШЕНИЕ-------------
  27. // Stage 1 & Stage 2
  28. const colors = ['red', 'yellow', 'green', 'yellow'];
  29. function vehiclesTrafficLights() {
  30. const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
  31. // const colorTime = { red: 3000, yellow: 1000, green: 3000 };
  32. // / Сделайте trafficLight более универсальной - добавьте в параметры DOM-элемент для отображения, а также время работы каждого цвета
  33. const domEventPromise = (knopka, eventName, time) => new Promise((resolve, reject) => {
  34. const promiseResolve = (e) => { knopka.removeEventListener(eventName, promiseResolve); resolve(e) };
  35. async function listener() {
  36. knopka.addEventListener(eventName, promiseResolve);
  37. await delay(time);
  38. reject(knopka.removeEventListener(eventName, promiseResolve));
  39. }
  40. listener();
  41. });
  42. async function trafficLight(root, colors, greenTime, yellowTime, redTime) {
  43. const colorsNew = colors.slice(0, colors.length - 1);
  44. root.innerHTML = colorsNew.map(color => ` <div id=${color} class='lightColor'></div> `).join('');
  45. while (true) {
  46. for (let color of colors) {
  47. eval(color).classList.toggle('on');
  48. // await delay(eval(`${color}Time`));
  49. await Promise.race([delay(eval(`${color}Time`)), domEventPromise(switchBtn, 'click', eval(`${color}Time`)).then(e => console.log('event click happens', e))]);
  50. eval(color).classList.toggle('on');
  51. }
  52. }
  53. }
  54. trafficLight(root, colors, 5000, 3000, 5000);
  55. };
  56. vehiclesTrafficLights(root, colors);