PedestrianTrafficLight-stage2_3.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. const domEventPromise = (element, eventName) => {
  2. return new Promise((resolve, reject) => {
  3. const handler = event => {
  4. resolve(event);
  5. element.removeEventListener(eventName, handler);
  6. }
  7. element.addEventListener(eventName, handler);
  8. });
  9. }
  10. const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms));
  11. const toggleLight = (switcher, className) => {
  12. const element = document.querySelector(className).classList;
  13. switcher ? element.add('on') : element.remove('on');
  14. }
  15. const addDomElement = (element) => {
  16. for(let i = 1; i <= 3; i++) {
  17. const domElement = document.createElement(element);
  18. domElement.classList.add('traffic-light__element');
  19. if(i === 1) {
  20. domElement.classList.add('green');
  21. } else if (i === 2) {
  22. domElement.classList.add('yellow');
  23. } else {
  24. domElement.classList.add('red');
  25. }
  26. trafficLightId.appendChild(domElement);
  27. }
  28. }
  29. const trafficLight = async (domElement, delayGreen, delayYellow, delayRed) => {
  30. addDomElement(domElement);
  31. while (true){
  32. toggleLight(false,'.red');
  33. toggleLight(true,'.green');
  34. await Promise.race([delay(delayGreen), Promise.all([delay(1000), domEventPromise(button, 'click')])]);
  35. toggleLight(false,'.green');
  36. toggleLight(true,'.yellow');
  37. await Promise.race([delay(delayYellow), Promise.all([delay(1000), domEventPromise(button, 'click')])]);
  38. toggleLight(false,'.yellow');
  39. toggleLight(true,'.red');
  40. await Promise.race([delay(delayRed), Promise.all([delay(1000), domEventPromise(button, 'click')])]);
  41. }
  42. }
  43. trafficLight('div',2000, 4000, 6000);