main.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. //Async/Await Homework 2
  2. //Светофор
  3. let traficLightsForCars = document.querySelectorAll(".traffic-lights__light--for-cars");
  4. let traficLightsForPedestrian = document.querySelectorAll(".traffic-lights__light--for-pedestrian");
  5. let button = document.querySelector(".traffic-lights__pedestrian-button");
  6. let delay = async function(ms) {
  7. return new Promise((resolve, reject) => {
  8. setTimeout(() => resolve(ms), ms);
  9. });
  10. };
  11. let domEventPromise = function(el, eventName) {
  12. return new Promise((resolve, reject) => {
  13. let resolveEl = function() {
  14. resolve(el);
  15. el.removeEventListener(eventName, resolveEl)
  16. };
  17. el.addEventListener(eventName, resolveEl);
  18. });
  19. };
  20. let toggleTraficLights = function(el, indexLightRemove, indexLightAdd, lightRemove, lightAdd) { // Функция которая отвечает за переключения цветов у светофора
  21. el[indexLightRemove].classList.remove(`traffic-lights__light--${lightRemove}`);
  22. el[indexLightAdd].classList.add(`traffic-lights__light--${lightAdd}`);
  23. };
  24. let countWorkingLightTime = async function(ms, indexCounter) { // Супер некрасивая, костыльная функция которая отвечает за обратный отсчет времени работы конкретного цвета у светофора
  25. const TIME = ms / 1000;
  26. let span = document.createElement("span"); // Создаю и стилизирую span в котором в дальнейшем буду вести обратный отсчет
  27. span.classList.add("traffic-lights__counter");
  28. for(let i = 0; i < traficLightsForCars.length; i++) { // Собсна сам костыль, ранее, при досрочном переключении светофора с зеленого на красный, функция countWorkingLightTime все равно продолжала вести обратный отсчет
  29. if(traficLightsForCars[i].firstElementChild) { // Теперь, с добавлением этой логики, при следующем (досрочном) вызове countWorkingLightTime, он сначала удаляет все спаны в которых ведутся обратные отсчеты
  30. traficLightsForCars[i].removeChild(traficLightsForCars[i].firstElementChild); // Предыдущая функция countWorkingLightTime которая отрисовывала счетчик у зеленого светофора больше не работает, т.к.
  31. };
  32. };
  33. traficLightsForCars[indexCounter].appendChild(span); // Помещаю спан в котором буду вести отсчет в активный светофор
  34. for(let i = TIME; i > 0; i--) {
  35. traficLightsForCars[indexCounter].querySelector(".traffic-lights__counter").textContent = i;
  36. await delay(1000);
  37. };
  38. traficLightsForCars[indexCounter].querySelector(".traffic-lights__counter").textContent = "";
  39. };
  40. let runTrafficLight = async function() {
  41. const FIRST_TRAFIC_LIGHT_FOR_CAR = 0;
  42. const SECOND_TRAFIC_LIGHT_FOR_CAR = 1;
  43. const THIRD_TRAFIC_LIGHT_FOR_CAR = 2;
  44. const FIRST_TRAFIC_LIGHT_FOR_PEDESTRING = 0;
  45. const SECOND_TRAFIC_LIGHT_FOR_PEDESTRING = 1;
  46. const WORKING_TIME_RED = 10000;
  47. const WORKING_TIME_YELLOW = 5000;
  48. const WORKING_TIME_GREEN = 15000;
  49. while(true) {
  50. toggleTraficLights(traficLightsForCars, THIRD_TRAFIC_LIGHT_FOR_CAR, FIRST_TRAFIC_LIGHT_FOR_CAR, "green", "red");
  51. toggleTraficLights(traficLightsForPedestrian, FIRST_TRAFIC_LIGHT_FOR_PEDESTRING, 1, "red", "green");
  52. await countWorkingLightTime(WORKING_TIME_RED, FIRST_TRAFIC_LIGHT_FOR_CAR);
  53. toggleTraficLights(traficLightsForCars, FIRST_TRAFIC_LIGHT_FOR_CAR, SECOND_TRAFIC_LIGHT_FOR_CAR, "red", "yellow");
  54. await countWorkingLightTime(WORKING_TIME_YELLOW, SECOND_TRAFIC_LIGHT_FOR_CAR);
  55. toggleTraficLights(traficLightsForCars, SECOND_TRAFIC_LIGHT_FOR_CAR, THIRD_TRAFIC_LIGHT_FOR_CAR, "yellow", "green");
  56. toggleTraficLights(traficLightsForPedestrian, SECOND_TRAFIC_LIGHT_FOR_PEDESTRING, FIRST_TRAFIC_LIGHT_FOR_PEDESTRING, "green", "red");
  57. await Promise.race([countWorkingLightTime(WORKING_TIME_GREEN, THIRD_TRAFIC_LIGHT_FOR_CAR), domEventPromise(button, "click")]);
  58. };
  59. };
  60. runTrafficLight();
  61. //speedtest
  62. let speedtest = async function(getPromise, count, parallel = 1) {
  63. const SPEEDTEST_START = new Date().getTime();
  64. let parallelStartArr = []; // Массивы в которых я буду хранить таймспан времени начала и конца работы одного Promise.all
  65. let parallelEndArr = []; // Для дальнейших вычислений средней времени работы
  66. let pushPromiseInArr = function() {
  67. let arrForParallelQueries = [];
  68. for(let i = 0; i < parallel; i++) {
  69. arrForParallelQueries.push(getPromise());
  70. };
  71. return arrForParallelQueries;
  72. };
  73. let countMeanParallelWork = function(startArr, endArr) {
  74. let meanStart = 0;
  75. let meanEnd = 0;
  76. for(let timespan of startArr) {
  77. meanStart += timespan;
  78. };
  79. for(let timespan of endArr) {
  80. meanEnd += timespan;
  81. };
  82. return (meanEnd - meanStart) / startArr.length;
  83. };
  84. for(let i = 0; i < count; i++) {
  85. parallelStartArr.push(new Date().getTime());
  86. await Promise.all(pushPromiseInArr());
  87. parallelEndArr.push(new Date().getTime());
  88. };
  89. const SPEEDTEST__END = new Date().getTime();
  90. let duration = SPEEDTEST__END - SPEEDTEST_START;
  91. let querySpeed = duration / 1000;
  92. let queryDuration = countMeanParallelWork(parallelStartArr, parallelEndArr);
  93. let parallelSpeed = countMeanParallelWork(parallelStartArr, parallelEndArr) / (count * parallel);
  94. let parallelDuration = count * parallel;
  95. return {
  96. duration,
  97. querySpeed,
  98. queryDuration,
  99. parallelSpeed,
  100. parallelDuration
  101. };
  102. };