js.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. //1. Chat
  2. async function jsonPost(url, data){
  3. try {
  4. let response = await fetch(url, {
  5. method: 'POST',
  6. body: JSON.stringify(data)
  7. })
  8. if (response.ok) {
  9. let json = await response.json()
  10. return json}
  11. } catch (error) {
  12. console.log('ошибка: ' + error) //ловим ошибки
  13. }
  14. }
  15. send.onclick = sendAndCheck
  16. async function sendAndCheck() {
  17. await sendMessage(userName.value, userMessage.value)
  18. getMessages (nextMessageId)
  19. }
  20. async function sendMessage(nick, message) {
  21. if (nick && message) {
  22. jsonPost("http://students.a-level.com.ua:10012", { func: 'addMessage', nick, message })
  23. }
  24. }
  25. async function getMessages (id) {
  26. const res = await jsonPost("http://students.a-level.com.ua:10012", { func: "getMessages", messageId: id}).then(res => res)
  27. nextMessageId = res.nextMessageId
  28. for(const msg of res.data){
  29. const chatBox = document.createElement('div')
  30. chat.prepend(chatBox)
  31. const chatName = document.createElement('div')
  32. chatBox.append(chatName)
  33. chatName.innerText = msg.nick + ': '
  34. chatName.classList.add('name')
  35. const chatMessage = document.createElement('div')
  36. chatBox.append(chatMessage)
  37. chatMessage.innerText = msg.message
  38. chatMessage.classList.add('text')
  39. const time = document.createElement('div');
  40. time.classList.add('time')
  41. const data = new Date(msg.timestamp)
  42. time.innerText = data.toLocaleDateString() + ' ' + data.toLocaleTimeString();
  43. chatBox.append(time)
  44. }
  45. }
  46. let nextMessageId = 0
  47. function delay(ms){
  48. function executor(fulfill, reject){
  49. setTimeout(() => fulfill(ms), ms)
  50. }
  51. return new Promise(executor)
  52. }
  53. async function checkLoop() {
  54. while(true) {
  55. getMessages (nextMessageId)
  56. await delay(2000)
  57. }
  58. }
  59. checkLoop()
  60. //2. SWAPI Links
  61. // Напишите промисифицированную функцию, которая принимать параметром ссылку на swapi.dev
  62. // (например, https://swapi.dev/api/people/20) и скачивать всю информацию по ссылке, включая вложенные ссылки. Все
  63. // ссылки внутри скачанного объекта должны заменяться на скачанные объекты. Полученный общий объект должен стать
  64. // результатом промиса, который возвращает функция.
  65. // Например, ссылка, приведенная выше позволяет информацию о Йода Мастере скачать:
  66. function fetchGet (url) {
  67. return fetch(url)
  68. .then((response) => {
  69. if (response.ok) {
  70. return response.json()
  71. } else {
  72. return Promise.reject(new Error(response.statusText))
  73. }
  74. } )
  75. }
  76. function swapiLinks (url) {
  77. let obj;
  78. return fetchGet(url)
  79. .then((response) => {
  80. console.log(response);
  81. obj = response;
  82. const linkPromises = [];
  83. Object.values(obj).forEach(value => {
  84. if (typeof value == 'string' && value.includes('https://swapi.dev/api/')) {
  85. linkPromises.push(fetchGet(value));
  86. } else if (Array.isArray(value)) {
  87. value.forEach((el) => {
  88. if (typeof el == 'string' && el.includes('https://swapi.dev/api/')) {
  89. linkPromises.push(fetchGet(el));
  90. }
  91. })
  92. }
  93. })
  94. return Promise.all(linkPromises)
  95. }).then(linkResponses => {
  96. Object.keys(obj).forEach(key => {
  97. if (typeof obj[key] == 'string' && obj[key].includes('https://swapi.dev/api/')) {
  98. obj[key] = linkResponses.shift();
  99. } else if (Array.isArray(obj[key])) {
  100. obj[key].forEach((el, i) => {
  101. if (typeof el == 'string' && el.includes('https://swapi.dev/api/')) {
  102. obj[key][i] = linkResponses.shift();
  103. }
  104. });
  105. }
  106. });
  107. return Promise.resolve(obj);
  108. })
  109. .catch((error) => {
  110. return Promise.reject(error);
  111. });
  112. }
  113. swapiLinks("https://swapi.dev/api/people/20/")
  114. .then(yodaWithLinks => {
  115. console.log(JSON.stringify(yodaWithLinks, null, 4));
  116. })
  117. .catch((error) => {
  118. console.log(error);
  119. });
  120. //domEventPromise +
  121. // Реализуйте промисифицированную функцию, которая резолвит промис по событию в DOM:
  122. // Функция должна:
  123. //
  124. // используя addEventListener повесить свой обработчик события на DOM element событие eventName
  125. // по событию зарезолвить промис отдав в качестве результата объект события
  126. // убрать обработчик с DOM-элемента, используя removeEventListener.
  127. //
  128. // Убедитесь, что действительно убираете обработчик после резолва промиса. Он больше не нужен.
  129. function domEventPromise(element, eventName) {
  130. function executor (resolve) {
  131. let myEvent = event => {
  132. resolve(event);
  133. element.removeEventListener(eventName, myEvent)
  134. }
  135. element.addEventListener(eventName, myEvent)
  136. }
  137. return new Promise(executor)
  138. }
  139. let button = document.createElement('button')
  140. document.body.append(button)
  141. button.innerText = "Click"
  142. domEventPromise(button, 'click').then( e => console.log('event click happens', e))