// ДЗ : Async, Await. Параллельность и Последовательность // задание 1 Chat { let nextMessageId = 0; // Отправляет сообщение в чат async function sendMessage(nick, message) { const data = { func: 'addMessage', nick: nick, message: message, nextMessageId: nextMessageId, }; const response = await jsonPost('http://students.a-level.com.ua:10012', data); nextMessageId = response.nextMessageId; return response; } // Читает все сообщения из чата и отображает их в контейнере async function readMessages() { const data = { func: 'getMessages', nextMessageId: nextMessageId, }; const response = await jsonPost('http://students.a-level.com.ua:10012', data); nextMessageId = response.nextMessageId; const messages = response.messages; const container = document.getElementById('chat-container'); for (const message of messages) { const messageNode = document.createElement('div'); messageNode.innerHTML = `${message.nick}: ${message.message}`; container.appendChild(messageNode); } } // Читает только новые сообщения из чата async function readNewMessages() { const data = { func: 'getMessages', nextMessageId: nextMessageId, }; const response = await jsonPost('http://students.a-level.com.ua:10012', data); nextMessageId = response.nextMessageId; const newMessages = response.messages; // обрабатывает новые сообщения } // Периодически проверяет наличие новых сообщений setInterval(readNewMessages, 5000); } // или (не уверен какой из вариантов правильный) { const serverUrl = 'http://students.a-level.com.ua:10012'; let nextMessageId = 0; // Отправляет сообщение в чат async function sendMessage(nick, message) { const data = { nick: nick, message: message, nextMessageId: nextMessageId, }; const response = await jsonPost(serverUrl, data); nextMessageId = response.nextMessageId; return response; } // Читает все сообщения из чата и отображает их в контейнере async function readMessages() { const response = await jsonPost(serverUrl, { nextMessageId: nextMessageId }); nextMessageId = response.nextMessageId; const messages = response.messages; const container = document.getElementById('chat-container'); for (const message of messages) { const messageNode = document.createElement('div'); messageNode.innerHTML = `${message.nick}: ${message.message}`; container.appendChild(messageNode); } } // Читает только новые сообщения из чата async function readNewMessages() { const response = await jsonPost(serverUrl, { nextMessageId: nextMessageId }); nextMessageId = response.nextMessageId; const newMessages = response.messages; // обрабатывает новые сообщения } // Периодически проверяет наличие новых сообщений setInterval(readNewMessages, 5000); // Отправка сообщения асинхронно async function sendMessageAsync(nick, message) { const send = await sendMessage(nick, message); const read = await readNewMessages(); return { send, read }; } } // задание 2 SWAPI Links { async function swapiLinks(url) { const response = await fetch(url); const data = await response.json(); const promises = []; for (let key in data) { if (typeof data[key] === 'string' && data[key].startsWith('http')) { promises.push(swapiLinks(data[key])); } if (Array.isArray(data[key])) { for (let item of data[key]) { if (typeof item === 'string' && item.startsWith('http')) { promises.push(swapiLinks(item)); } } } } const resolvedLinks = await Promise.all(promises); for (let key in data) { if (typeof data[key] === 'string' && data[key].startsWith('http')) { data[key] = resolvedLinks.shift(); } if (Array.isArray(data[key])) { for (let i = 0; i < data[key].length; i++) { if (typeof data[key][i] === 'string' && data[key][i].startsWith('http')) { data[key][i] = resolvedLinks.shift(); } } } } return data; } swapiLinks('https://swapi.dev/api/people/20/'); const swapiLinks = async (url) => { const response = await fetch(url); const data = await response.json(); const promises = []; const replaceLinks = (obj) => { Object.keys(obj).forEach((key) => { if (Array.isArray(obj[key])) { obj[key] = obj[key].map(replaceLinks); } else if (typeof obj[key] === 'object' && obj[key] !== null) { replaceLinks(obj[key]); } else if (typeof obj[key] === 'string' && obj[key].startsWith('https://swapi.dev/api/')) { promises.push( fetch(obj[key]) .then((res) => res.json()) .then((json) => (obj[key] = json)), ); } }); }; replaceLinks(data); await Promise.all(promises); return data; }; swapiLinks('https://swapi.dev/api/people/20/').then((yodaWithLinks) => console.log(JSON.stringify(yodaWithLinks, null, 4)), ); } // задание 3 domEventPromise { function domEventPromise(element, eventName) { return new Promise((resolve) => { function eventHandler(event) { resolve(event); element.removeEventListener(eventName, eventHandler); } element.addEventListener(eventName, eventHandler); }); } const button = document.querySelector('button'); domEventPromise(button, 'click').then((event) => console.log('event click happens', event)); }