promiseBasic.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // Javascript Async: Promise Homework
  2. // fetch basic
  3. // -------------УСЛОВИЕ-------------
  4. // С помощью следующего кода считать и вывести информацию о Люке Скайвокере:
  5. // fetch('https://swapi.dev/api/people/1/')
  6. // .then(res => res.json())
  7. // .then(luke => console.log(luke))
  8. // Напишите функцию для отображения любого JSON в форме таблицы. Функция должна принимать два параметра:
  9. // DOM - элемент, в котором строится таблица
  10. // JSON, который нужно отобразить.
  11. // -------------РЕШЕНИЕ-------------
  12. const task02block = document.createElement('div');
  13. task02block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
  14. const task02title = document.createElement('h2');
  15. task02title.innerText = 'Task-02 Fetch basic';
  16. root.appendChild(task02block);
  17. task02block.appendChild(task02title);
  18. function drawTable(block, JSONdata) {
  19. const heroTable = document.createElement('table');
  20. heroTable.innerHTML = "";
  21. heroTable.border = "1";
  22. heroTable.style.maxWidth="1000px";
  23. heroTable.insertAdjacentHTML('beforeend', '<caption><b>Hero portfolio</b></caption>');
  24. const heroTableHead = document.createElement('tr');
  25. const heroTableBody= document.createElement('tr');
  26. heroTableHead.innerHTML = Object.keys(JSONdata).map(key => `<th>${key}</th>`).join('');
  27. heroTableBody.innerHTML = Object.values(JSONdata).map(item => `<td>${item}</td>`).join('').split(',').join(', ');
  28. heroTable.appendChild(heroTableHead);
  29. heroTable.appendChild(heroTableBody);
  30. block.appendChild(heroTable);
  31. }
  32. let url1 = 'https://swapi.dev/api/people/1/';
  33. fetch(url1)
  34. .then(res => res.json())
  35. .then(luke => drawTable(task02block, luke))
  36. // fetch improved
  37. // -------------УСЛОВИЕ-------------
  38. // Расширить функцию отображения:
  39. // Если одно из полей строка или массив.
  40. // Если строки или строка содержат в себе https://swapi.dev/api/, то выводить вместо текста строки кнопку, при нажатии на которую:
  41. // делается fetch данных по этой ссылке
  42. // функция отображения запускает сама себя(рекурсивно) для отображения новых данных в том же элементе.
  43. // -------------РЕШЕНИЕ-------------
  44. const task03block = document.createElement('div');
  45. task03block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
  46. const task03title = document.createElement('h2');
  47. const task03fetchBlock = document.createElement('div');
  48. task03title.innerText = 'Task-03 Fetch improved';
  49. root.appendChild(task03block);
  50. task03block.appendChild(task03title);
  51. task03block.appendChild(task03fetchBlock);
  52. function drawTableImproved(block, JSONdata, url) {
  53. block.innerHTML = '';
  54. const link = 'https://swapi.dev/api/';
  55. const heroTable = document.createElement('table');
  56. heroTable.innerHTML = "";
  57. heroTable.border = "1";
  58. heroTable.style.maxWidth="1000px";
  59. let caption=url.split('/')[4];
  60. heroTable.insertAdjacentHTML('beforeend', `<caption><b>${caption[0].toUpperCase() + caption.slice(1)}</b></caption>`);
  61. const heroTableHead = document.createElement('tr');
  62. const heroTableBody= document.createElement('tr');
  63. heroTableHead.innerHTML = Object.keys(JSONdata).map(key => `<th>${key}</th>`).join('');
  64. for (let item of Object.values(JSONdata)) {
  65. const tableBodyCell = document.createElement('td');
  66. if (isNaN(item)&&item.includes(link)) {
  67. const btnBodyCell = document.createElement('button');
  68. btnBodyCell.style.margin = '5px';
  69. btnBodyCell.value = item;
  70. btnBodyCell.innerText = "Go to";
  71. url = item;
  72. btnBodyCell.onclick = () => {fetchFunc( btnBodyCell.value)};
  73. tableBodyCell.appendChild(btnBodyCell);
  74. }
  75. else {
  76. if (Array.isArray(item) && item.filter(elem => elem.includes(link)).length) {
  77. let i = 1;
  78. for (let subItem of item) {
  79. const btnBodyCell = document.createElement('button');
  80. btnBodyCell.style.margin = '5px';
  81. btnBodyCell.value = subItem;
  82. btnBodyCell.innerText = 'Go to ' + i;
  83. url=subItem;
  84. btnBodyCell.onclick = () => {fetchFunc(btnBodyCell.value)};
  85. tableBodyCell.appendChild(btnBodyCell);
  86. i++;
  87. }
  88. }
  89. else { tableBodyCell.innerText = item; }
  90. }
  91. heroTableBody.appendChild(tableBodyCell);
  92. }
  93. heroTable.appendChild(heroTableHead);
  94. heroTable.appendChild(heroTableBody);
  95. block.appendChild(heroTable);
  96. }
  97. let url = 'https://swapi.dev/api/people/1/';
  98. function fetchFunc(url) {
  99. fetch(url)
  100. .then(res => res.json())
  101. .then(luke => drawTableImproved(task03fetchBlock, luke, url))
  102. }
  103. fetchFunc(url);
  104. // myfetch
  105. // -------------УСЛОВИЕ-------------
  106. // Используя XMLHTTPRequest, напишите промисифицированную функцию myfetch, т.е.функцию, которая возвращает промис,
  107. // и работает схоже с fetch, только в один этап:
  108. // myfetch('https://swapi.dev/api/people/1/')
  109. // .then(luke => console.log(luke))
  110. // Функция myfetch ожидает что ответ будет в формате JSON(используйте JSON.parse(response.text))
  111. // В случае ошибок(request.onerror или request.status не 200) не забудьте вызывать reject
  112. // function myfetch(url){
  113. // return new Promise(function (resolve, reject){
  114. // const xhr = new XMLHTTPRequest()
  115. // ///...
  116. // })
  117. // }
  118. // -------------РЕШЕНИЕ-------------
  119. const task04block = document.createElement('div');
  120. task04block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
  121. const task04title = document.createElement('h2');
  122. const task04fetchBlock = document.createElement('div');
  123. task04title.innerText = 'Task-04 My fetch';
  124. root.appendChild(task04block);
  125. task04block.appendChild(task04title);
  126. task04block.appendChild(task04fetchBlock);
  127. function myfetch(url) {
  128. return new Promise(function(resolve, reject) {
  129. const xhr = new XMLHttpRequest();
  130. xhr.open('GET', url, true);
  131. xhr.onload = function() {
  132. if (this.status == 200) {
  133. resolve(JSON.parse(xhr.responseText));
  134. } else {
  135. var error = new Error(this.statusText);
  136. error.code = this.status;
  137. alert(error);
  138. reject(error);
  139. }
  140. };
  141. xhr.onerror = function() {reject(new Error("Network Error"));
  142. };
  143. xhr.send();
  144. });
  145. }
  146. myfetch(url)
  147. .then(luke => {
  148. console.log(luke);
  149. drawTableImproved(task04fetchBlock, luke, url)
  150. }
  151. );
  152. // race
  153. // -------------УСЛОВИЕ-------------
  154. // Используя Promise.race запустите запрос на API(myfetch) параллельно с delay.
  155. // По результату определите, что было быстрее, запрос по сети, или определенный интервал времени.
  156. // Подберите параметр delay так, чтобы результат был неизвестен изначально, и при многократных запусках быстрее был то delay,
  157. // то myfetch.
  158. // -------------РЕШЕНИЕ-------------
  159. const task05block = document.createElement('div');
  160. task05block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px";
  161. const task05title = document.createElement('h2');
  162. const task05fetchBlock = document.createElement('div');
  163. task05title.innerText = 'Task-05 race';
  164. const runPromisesBtn = document.createElement('button');
  165. runPromisesBtn.innerText = 'Run promises';
  166. runPromisesBtn.style = 'margin-bottom:20px';
  167. root.appendChild(task05block);
  168. task05block.appendChild(task05title);
  169. task05block.appendChild(runPromisesBtn);
  170. task05block.appendChild(task05fetchBlock);
  171. runPromisesBtn.onclick = () => {
  172. task05fetchBlock.innerHTML = '';
  173. const delay = async (ms) => await new Promise((resolve, reject) => setTimeout(() => resolve('2-nd promise'), ms));
  174. Promise.race([myfetch(url), delay(100)]).then((value) => {
  175. console.log(value);
  176. const firstPromise = document.createElement('p');
  177. firstPromise.innerText = `Faster was ${JSON.stringify(value)}`;
  178. task05fetchBlock.appendChild(firstPromise);
  179. })
  180. }