123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- //1. Chat
- async function jsonPost(url, data){
- try {
- let response = await fetch(url, {
- method: 'POST',
- body: JSON.stringify(data)
- })
- if (response.ok) {
- let json = await response.json()
- return json}
- } catch (error) {
- console.log('ошибка: ' + error) //ловим ошибки
- }
- }
- send.onclick = sendAndCheck
- async function sendAndCheck() {
- await sendMessage(userName.value, userMessage.value)
- getMessages (nextMessageId)
- }
- async function sendMessage(nick, message) {
- if (nick && message) {
- jsonPost("http://students.a-level.com.ua:10012", { func: 'addMessage', nick, message })
- }
- }
- async function getMessages (id) {
- const res = await jsonPost("http://students.a-level.com.ua:10012", { func: "getMessages", messageId: id}).then(res => res)
- nextMessageId = res.nextMessageId
- for(const msg of res.data){
- const chatBox = document.createElement('div')
- chat.prepend(chatBox)
- const chatName = document.createElement('div')
- chatBox.append(chatName)
- chatName.innerText = msg.nick + ': '
- chatName.classList.add('name')
- const chatMessage = document.createElement('div')
- chatBox.append(chatMessage)
- chatMessage.innerText = msg.message
- chatMessage.classList.add('text')
- const time = document.createElement('div');
- time.classList.add('time')
- const data = new Date(msg.timestamp)
- time.innerText = data.toLocaleDateString() + ' ' + data.toLocaleTimeString();
- chatBox.append(time)
- }
- }
- let nextMessageId = 0
- function delay(ms){
- function executor(fulfill, reject){
- setTimeout(() => fulfill(ms), ms)
- }
- return new Promise(executor)
- }
- async function checkLoop() {
- while(true) {
- getMessages (nextMessageId)
- await delay(2000)
- }
- }
- checkLoop()
- //2. SWAPI Links
- // Напишите промисифицированную функцию, которая принимать параметром ссылку на swapi.dev
- // (например, https://swapi.dev/api/people/20) и скачивать всю информацию по ссылке, включая вложенные ссылки. Все
- // ссылки внутри скачанного объекта должны заменяться на скачанные объекты. Полученный общий объект должен стать
- // результатом промиса, который возвращает функция.
- // Например, ссылка, приведенная выше позволяет информацию о Йода Мастере скачать:
- function fetchGet (url) {
- return fetch(url)
- .then((response) => {
- if (response.ok) {
- return response.json()
- } else {
- return Promise.reject(new Error(response.statusText))
- }
- } )
- }
- function swapiLinks (url) {
- let obj;
- return fetchGet(url)
- .then((response) => {
- console.log(response);
- obj = response;
- const linkPromises = [];
- Object.values(obj).forEach(value => {
- if (typeof value == 'string' && value.includes('https://swapi.dev/api/')) {
- linkPromises.push(fetchGet(value));
- } else if (Array.isArray(value)) {
- value.forEach((el) => {
- if (typeof el == 'string' && el.includes('https://swapi.dev/api/')) {
- linkPromises.push(fetchGet(el));
- }
- })
- }
- })
- return Promise.all(linkPromises)
- }).then(linkResponses => {
- Object.keys(obj).forEach(key => {
- if (typeof obj[key] == 'string' && obj[key].includes('https://swapi.dev/api/')) {
- obj[key] = linkResponses.shift();
- } else if (Array.isArray(obj[key])) {
- obj[key].forEach((el, i) => {
- if (typeof el == 'string' && el.includes('https://swapi.dev/api/')) {
- obj[key][i] = linkResponses.shift();
- }
- });
- }
- });
- return Promise.resolve(obj);
- })
- .catch((error) => {
- return Promise.reject(error);
- });
- }
- swapiLinks("https://swapi.dev/api/people/20/")
- .then(yodaWithLinks => {
- console.log(JSON.stringify(yodaWithLinks, null, 4));
- })
- .catch((error) => {
- console.log(error);
- });
- //domEventPromise +
- // Реализуйте промисифицированную функцию, которая резолвит промис по событию в DOM:
- // Функция должна:
- //
- // используя addEventListener повесить свой обработчик события на DOM element событие eventName
- // по событию зарезолвить промис отдав в качестве результата объект события
- // убрать обработчик с DOM-элемента, используя removeEventListener.
- //
- // Убедитесь, что действительно убираете обработчик после резолва промиса. Он больше не нужен.
- function domEventPromise(element, eventName) {
- function executor (resolve) {
- let myEvent = event => {
- resolve(event);
- element.removeEventListener(eventName, myEvent)
- }
- element.addEventListener(eventName, myEvent)
- }
- return new Promise(executor)
- }
- let button = document.createElement('button')
- document.body.append(button)
- button.innerText = "Click"
- domEventPromise(button, 'click').then( e => console.log('event click happens', e))
|