// ДЗ : 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));
}