index.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // ДЗ : Async, Await. Параллельность и Последовательность
  2. // задание 1 Chat
  3. {
  4. let nextMessageId = 0;
  5. // Отправляет сообщение в чат
  6. async function sendMessage(nick, message) {
  7. const data = {
  8. func: 'addMessage',
  9. nick: nick,
  10. message: message,
  11. nextMessageId: nextMessageId,
  12. };
  13. const response = await jsonPost('http://students.a-level.com.ua:10012', data);
  14. nextMessageId = response.nextMessageId;
  15. return response;
  16. }
  17. // Читает все сообщения из чата и отображает их в контейнере
  18. async function readMessages() {
  19. const data = {
  20. func: 'getMessages',
  21. nextMessageId: nextMessageId,
  22. };
  23. const response = await jsonPost('http://students.a-level.com.ua:10012', data);
  24. nextMessageId = response.nextMessageId;
  25. const messages = response.messages;
  26. const container = document.getElementById('chat-container');
  27. for (const message of messages) {
  28. const messageNode = document.createElement('div');
  29. messageNode.innerHTML = `<b>${message.nick}</b>: ${message.message}`;
  30. container.appendChild(messageNode);
  31. }
  32. }
  33. // Читает только новые сообщения из чата
  34. async function readNewMessages() {
  35. const data = {
  36. func: 'getMessages',
  37. nextMessageId: nextMessageId,
  38. };
  39. const response = await jsonPost('http://students.a-level.com.ua:10012', data);
  40. nextMessageId = response.nextMessageId;
  41. const newMessages = response.messages;
  42. // обрабатывает новые сообщения
  43. }
  44. // Периодически проверяет наличие новых сообщений
  45. setInterval(readNewMessages, 5000);
  46. }
  47. // или (не уверен какой из вариантов правильный)
  48. {
  49. const serverUrl = 'http://students.a-level.com.ua:10012';
  50. let nextMessageId = 0;
  51. // Отправляет сообщение в чат
  52. async function sendMessage(nick, message) {
  53. const data = {
  54. nick: nick,
  55. message: message,
  56. nextMessageId: nextMessageId,
  57. };
  58. const response = await jsonPost(serverUrl, data);
  59. nextMessageId = response.nextMessageId;
  60. return response;
  61. }
  62. // Читает все сообщения из чата и отображает их в контейнере
  63. async function readMessages() {
  64. const response = await jsonPost(serverUrl, { nextMessageId: nextMessageId });
  65. nextMessageId = response.nextMessageId;
  66. const messages = response.messages;
  67. const container = document.getElementById('chat-container');
  68. for (const message of messages) {
  69. const messageNode = document.createElement('div');
  70. messageNode.innerHTML = `<b>${message.nick}</b>: ${message.message}`;
  71. container.appendChild(messageNode);
  72. }
  73. }
  74. // Читает только новые сообщения из чата
  75. async function readNewMessages() {
  76. const response = await jsonPost(serverUrl, { nextMessageId: nextMessageId });
  77. nextMessageId = response.nextMessageId;
  78. const newMessages = response.messages;
  79. // обрабатывает новые сообщения
  80. }
  81. // Периодически проверяет наличие новых сообщений
  82. setInterval(readNewMessages, 5000);
  83. // Отправка сообщения асинхронно
  84. async function sendMessageAsync(nick, message) {
  85. const send = await sendMessage(nick, message);
  86. const read = await readNewMessages();
  87. return { send, read };
  88. }
  89. }
  90. // задание 2 SWAPI Links
  91. {
  92. async function swapiLinks(url) {
  93. const response = await fetch(url);
  94. const data = await response.json();
  95. const promises = [];
  96. for (let key in data) {
  97. if (typeof data[key] === 'string' && data[key].startsWith('http')) {
  98. promises.push(swapiLinks(data[key]));
  99. }
  100. if (Array.isArray(data[key])) {
  101. for (let item of data[key]) {
  102. if (typeof item === 'string' && item.startsWith('http')) {
  103. promises.push(swapiLinks(item));
  104. }
  105. }
  106. }
  107. }
  108. const resolvedLinks = await Promise.all(promises);
  109. for (let key in data) {
  110. if (typeof data[key] === 'string' && data[key].startsWith('http')) {
  111. data[key] = resolvedLinks.shift();
  112. }
  113. if (Array.isArray(data[key])) {
  114. for (let i = 0; i < data[key].length; i++) {
  115. if (typeof data[key][i] === 'string' && data[key][i].startsWith('http')) {
  116. data[key][i] = resolvedLinks.shift();
  117. }
  118. }
  119. }
  120. }
  121. return data;
  122. }
  123. swapiLinks('https://swapi.dev/api/people/20/');
  124. const swapiLinks = async (url) => {
  125. const response = await fetch(url);
  126. const data = await response.json();
  127. const promises = [];
  128. const replaceLinks = (obj) => {
  129. Object.keys(obj).forEach((key) => {
  130. if (Array.isArray(obj[key])) {
  131. obj[key] = obj[key].map(replaceLinks);
  132. } else if (typeof obj[key] === 'object' && obj[key] !== null) {
  133. replaceLinks(obj[key]);
  134. } else if (typeof obj[key] === 'string' && obj[key].startsWith('https://swapi.dev/api/')) {
  135. promises.push(
  136. fetch(obj[key])
  137. .then((res) => res.json())
  138. .then((json) => (obj[key] = json)),
  139. );
  140. }
  141. });
  142. };
  143. replaceLinks(data);
  144. await Promise.all(promises);
  145. return data;
  146. };
  147. swapiLinks('https://swapi.dev/api/people/20/').then((yodaWithLinks) =>
  148. console.log(JSON.stringify(yodaWithLinks, null, 4)),
  149. );
  150. }
  151. // задание 3 domEventPromise
  152. {
  153. function domEventPromise(element, eventName) {
  154. return new Promise((resolve) => {
  155. function eventHandler(event) {
  156. resolve(event);
  157. element.removeEventListener(eventName, eventHandler);
  158. }
  159. element.addEventListener(eventName, eventHandler);
  160. });
  161. }
  162. const button = document.querySelector('button');
  163. domEventPromise(button, 'click').then((event) => console.log('event click happens', event));
  164. }