js.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. //1. Светофор Используя асинхронную функцию и бесконечный цикл, просимулируйте светофор:
  2. // {
  3. // const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms));
  4. //
  5. // let red = document.getElementById('red')
  6. // let yellow = document.getElementById('yellow')
  7. // let green = document.getElementById('green')
  8. //
  9. // async function trafficLight(greenEl, yellowEl, redEl, greenTime, yellowTime, redTime) {
  10. // while (true) {
  11. //
  12. // greenEl.classList.add('green')
  13. // await delay(greenTime)
  14. // greenEl.classList.remove('green');
  15. //
  16. // yellowEl.classList.add('yellow');
  17. // await delay(yellowTime);
  18. // yellowEl.classList.remove('yellow');
  19. //
  20. // redEl.classList.add('red');
  21. // await delay(redTime);
  22. // redEl.classList.remove('red');
  23. // }
  24. // }
  25. //
  26. // trafficLight(green, yellow, red, 4000, 1000, 4000);
  27. // }
  28. // PedestrianTrafficLight
  29. // Напишите упрощенный светофор для пешеходов
  30. // Stage 2
  31. // Используя Promise.race, domEventPromise и кнопку в DOM сделайте пешеходный светофор с кнопкой, который так
  32. // же переключается по времени периодически.
  33. // Stage 3
  34. // Не давайте возможности пешеходам сильно наглеть - предусмотрите задержку, после которой будет работать
  35. // кнопка.
  36. // {
  37. // const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms));
  38. //
  39. // let container = document.getElementById('pedastrian-container')
  40. // let red = document.getElementById('red-light');
  41. // let green = document.getElementById('green-light');
  42. // let button = document.getElementById('button');
  43. //
  44. // function domEventPromise(element, eventName) {
  45. // function executor(resolve) {
  46. // function myEvent(event) {
  47. // element.disabled = true;
  48. // element.removeEventListener(eventName, myEvent);
  49. // setTimeout(() => resolve(event), 2000);
  50. // }
  51. // element.disabled = false;
  52. // element.addEventListener(eventName, myEvent)
  53. // }
  54. // return new Promise(executor);
  55. // }
  56. //
  57. // async function pedestrianTrafficLight(ms) {
  58. // while (true) {
  59. // red.classList.add('red');
  60. // await Promise.race([
  61. // delay(ms),
  62. // domEventPromise(button, 'click')
  63. // ]);
  64. // red.classList.remove('red');
  65. // green.classList.add('green');
  66. // await delay(ms);
  67. // green.classList.remove('green');
  68. // }
  69. // }
  70. // pedestrianTrafficLight(10000);
  71. // }
  72. //3. speedtest
  73. // Написать асинхронную функцию
  74. //
  75. // const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms));
  76. //
  77. // function makeProfileTimer() {
  78. // let t0 = performance.now();
  79. // return function () {
  80. // let t1 = performance.now();
  81. // return t1 - t0;
  82. // }
  83. // }
  84. //
  85. // async function speedtest(getPromise, count, parallel = 1) {
  86. // let timer = makeProfileTimer();
  87. // for (let i = 0; i < count; i++) {
  88. // let promises = [];
  89. // for (let j = 0; j < parallel; j++) {
  90. // promises.push(getPromise());
  91. // }
  92. // console.log(await Promise.all(promises));
  93. // }
  94. //
  95. // let duration = timer();
  96. // let parallelDuration = duration / (count * parallel);
  97. // let parallelSpeed = 1 / parallelDuration;
  98. // let queryDuration = duration / count;
  99. // let querySpeed = 1 / queryDuration;
  100. //
  101. // return {
  102. // duration,
  103. // querySpeed, //средняя скорость одного запроса
  104. // queryDuration, //
  105. // parallelSpeed,
  106. // parallelDuration
  107. // }
  108. // }
  109. //
  110. // speedtest(() => delay(1000), 10, 10)
  111. // .then(result => console.log(result));
  112. // // {duration: 10000,
  113. // // querySpeed: 0.001, //1 тысячная запроса за миллисекунду
  114. // // queryDuration: 1000, //1000 миллисекунд на один реальный запрос в среднем
  115. // // parallelSpeed: 0.01 // 100 запросов за 10000 миллисекунд
  116. // // parallelDuration: 100 // 100 запросов за 10000 миллисекунд
  117. // speedtest(() => fetch('http://swapi.dev/api/people/1')
  118. // .then(res => res.json()), 10, 5)
  119. // .then(result => console.log(result));
  120. //4.gql
  121. // Напишите функцию gql, которая осуществляет GraphQL запрос. Функция принимает три параметра:
  122. //
  123. // Эндпоинт - адрес сервера. Например "http://shop-roles.node.ed.asmer.org.ua/graphql"
  124. // Текст запроса (query). Например:
  125. function gql (endpoint, query, variables){
  126. return fetch(endpoint,{
  127. method: "POST",
  128. headers: {
  129. "Content-type": "application/Json",
  130. 'Accept': 'application/json'
  131. },
  132. body: JSON.stringify({
  133. query,
  134. variables
  135. })
  136. }).then(response => response.json())
  137. }
  138. (async () => {
  139. const catQuery = `query cats($q: String){
  140. CategoryFind(query: $q){
  141. _id name
  142. }
  143. }`
  144. const cats = await gql("http://shop-roles.node.ed.asmer.org.ua/graphql", catQuery, { q: "[{}]" })
  145. console.log(cats) //список категорий с _id name и всем таким прочим
  146. const loginQuery = `query login($login:String, $password:String){
  147. login(login:$login, password:$password)
  148. }`
  149. const token = await gql("http://shop-roles.node.ed.asmer.org.ua/graphql", loginQuery, { login: "test457", password: "123123" })
  150. console.log(token)
  151. })()
  152. //5. jwtDecode
  153. // Напишете функцию jwtDecode, которая принимает единственный параметр token и возвращает информацию из переданного JWT токена.
  154. // Алгоритм раскодирования:
  155. // Разбить токен на три части. Разделитель - . (точка)
  156. // Выделить среднюю часть.
  157. // Используя функцию atob раскодировать среднюю часть из кодировки Base64, получив JSON
  158. // Раскодировать JSON
  159. // Вернуть раскодированные данные из JSON
  160. //
  161. // Учтите, что в качестве токена может быть передана какая-то дичь. В таком случае раскодировка не получится, и функция:
  162. //
  163. // Не должна сыпать красными матюками (ошибками) в консоль
  164. // Должна просто вернуть undefined
  165. function jwtDecode(token) {
  166. let result;
  167. try {
  168. let secondPartToken = token.split('.')[1];
  169. result = JSON.parse(atob(secondPartToken));
  170. } catch (e) {
  171. }
  172. return result;
  173. }
  174. try {
  175. console.log(jwtDecode()) //undefined
  176. console.log(jwtDecode("дичь")) //undefined
  177. console.log(jwtDecode("ey.ey.ey")) //undefined
  178. console.log('до сюда доработало, а значит jwtDecode не матерился в консоль красным цветом')
  179. }
  180. finally{
  181. console.log('ДЗ, видимо, окончено')
  182. }