script.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. // Class Work (Telegram)
  2. const getGQL = url => async (query, variables) => {
  3. return await fetch(url, {
  4. method: 'POST',
  5. headers: {
  6. "Content-Type": "application/json"
  7. },
  8. body: JSON.stringify({ query, variables })
  9. })
  10. .then(res => res.json())
  11. .then(data => {
  12. if (!data.data && data.errors)
  13. throw new Error(JSON.stringify(data.errors))
  14. return data.data[Object.keys(data.data)[0]]
  15. })
  16. }
  17. const gql = getGQL('http://shop-roles.asmer.fs.a-level.com.ua/graphql');
  18. (async () => {
  19. let result = await gql(`query cats ($q:String) {CategoryFind(query: $q){name goods{name images{url}}}}`,{"q": "[{}]"});
  20. let div = document.createElement('div');
  21. for (const key in result) {
  22. let p = document.createElement('p');
  23. let str = '<ul>';
  24. for (const keys in result[key]['goods']) {
  25. str += `<li>${result[key]['goods'][keys]['name']}</li>`;
  26. }
  27. str += '</ul>';
  28. p.innerHTML = `<strong>${key}:</strong> ${result[key]['name']} ${str}`;
  29. div.append(p);
  30. }
  31. document.body.append(div);
  32. })()
  33. // Светофор
  34. const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms));
  35. async function trafficLight(container, delayGreen, delayYellow, delayRed){
  36. let green = document.createElement('div');
  37. let yellow = document.createElement('div');
  38. let red = document.createElement('div');
  39. green.className = 'lighter__elem';
  40. yellow.className = 'lighter__elem';
  41. red.className = 'lighter__elem';
  42. container.append(green, yellow, red);
  43. while (true){
  44. yellow.style.backgroundColor = '#696969FF';
  45. green.style.backgroundColor = '#309600';
  46. await delay(delayGreen)
  47. green.style.backgroundColor = '#696969FF';
  48. yellow.style.backgroundColor = '#e2e83c';
  49. await delay(delayYellow)
  50. yellow.style.backgroundColor = '#696969FF';
  51. red.style.backgroundColor = '#b93c00';
  52. await delay(delayRed)
  53. red.style.backgroundColor = '#696969FF';
  54. yellow.style.backgroundColor = '#e2e83c';
  55. await delay(delayYellow)
  56. }
  57. }
  58. (async () => {
  59. await trafficLight(lighter, 10000, 5000, 10000);
  60. })();
  61. // domEventPromise
  62. async function domEventPromise(element, eventName) {
  63. return new Promise(async (resolve, reject) => {
  64. try {
  65. element.addEventListener(eventName.toLowerCase(), async (e) => {
  66. await resolve(e);
  67. element.removeEventListener(eventName.toLowerCase(), this);
  68. })
  69. } catch (err) {
  70. await reject(err);
  71. }
  72. })
  73. }
  74. domEventPromise(knopka, 'click').then(e => console.log('event click happens', e));
  75. // PedestrianTrafficLight светофор для пешеходов
  76. async function PedestrianTrafficLight() {
  77. let h = document.createElement('h1')
  78. h.textContent = 'Светофор для пешеходов синхронизированный с автомобильным светофором'
  79. h.style.textAlign = 'center'
  80. document.body.append(h);
  81. let container = document.createElement('div');
  82. let green = document.createElement('div');
  83. let red = document.createElement('div');
  84. let btn = document.createElement('button');
  85. green.className = 'lighter__elem';
  86. red.className = 'lighter__elem';
  87. red.style.backgroundColor = '#b93c00';
  88. green.style.backgroundColor = '#696969FF';
  89. container.className = 'container';
  90. btn.textContent = 'PedestrianTrafficLight';
  91. container.append(green, red, btn);
  92. document.body.append(container);
  93. let container2 = document.createElement('div');
  94. let greenAuto = document.createElement('div');
  95. let yellowAuto = document.createElement('div');
  96. let redAuto = document.createElement('div');
  97. greenAuto.className = 'lighter__elem';
  98. yellowAuto.className = 'lighter__elem';
  99. redAuto.className = 'lighter__elem';
  100. container2.className = 'container';
  101. container2.append(greenAuto, yellowAuto, redAuto);
  102. document.body.append(container2);
  103. while (true) {
  104. yellowAuto.style.backgroundColor = '#696969FF';
  105. greenAuto.style.backgroundColor = '#309600';
  106. btn.disabled = true;
  107. await delay(5000)
  108. greenAuto.style.backgroundColor = '#696969FF';
  109. yellowAuto.style.backgroundColor = '#e2e83c';
  110. btn.disabled = true;
  111. await delay(1000)
  112. yellowAuto.style.backgroundColor = '#696969FF';
  113. redAuto.style.backgroundColor = '#b93c00';
  114. btn.disabled = false;
  115. await Promise.race([
  116. domEventPromise(btn, 'click').then(async e => {
  117. red.style.backgroundColor = '#696969FF';
  118. green.style.backgroundColor = '#309600';
  119. btn.disabled = true;
  120. await delay(3000);
  121. green.style.backgroundColor = '#696969FF';
  122. red.style.backgroundColor = '#b93c00';
  123. }, err => console.log(err)),
  124. await delay(5000)]
  125. );
  126. redAuto.style.backgroundColor = '#696969FF';
  127. yellowAuto.style.backgroundColor = '#e2e83c';
  128. btn.disabled = true;
  129. await delay(1000)
  130. }
  131. }
  132. (async () => await PedestrianTrafficLight())()
  133. // speedtest
  134. async function speedtest(getPromise, count=1, parallel=1) {
  135. let duration, querySpeed, queryDuration, parallelSpeed, parallelDuration;
  136. let start = performance.now(); // duration
  137. let querySpeedArr = [];
  138. await (async () => {
  139. for (let i = 0; i < count; i++) {
  140. let arrPromise = []
  141. for (let j = 0; j < parallel; j++) {
  142. arrPromise.push(getPromise);
  143. }
  144. let querySpeedItemStart = performance.now();
  145. await Promise.all([...arrPromise.map(item => item())]);
  146. querySpeedArr.push(performance.now() - querySpeedItemStart);
  147. }
  148. })()
  149. duration = Math.round(performance.now() - start);
  150. querySpeed = (count * parallel) / 100000;
  151. queryDuration = querySpeedArr.reduce((a, b) => (a + b)) / querySpeedArr.length;
  152. parallelSpeed = duration / (count * parallel) / 10000;
  153. parallelDuration = duration / (count * parallel);
  154. return {
  155. duration, //общая длительность работы цикла
  156. querySpeed, //реальная средняя скорость запроса
  157. queryDuration, //реальное среднее время запроса
  158. parallelSpeed, //скорость в запросах в миллисекунду
  159. parallelDuration //среднее время обработки запроса параллельно
  160. }
  161. }
  162. speedtest(() => delay(1000), 10, 10).then(result => console.log(result))
  163. speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 10, 5).then(result => console.log(result));