script.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. //Javascript Async: Promise Homework
  2. /* fetch basic
  3. С помощью следующего кода считать и вывести информацию о Люке Скайвокере:
  4. fetch('https://swapi.dev/api/people/1/')
  5. .then(res => res.json())
  6. .then(luke => console.log(luke)) */
  7. fetch('https://swapi.dev/api/people/1/')
  8. .then(res => res.json())
  9. .then(luke => console.log(luke))
  10. let dataLuke = async () => {
  11. try {
  12. await fetch('https://swapi.dev/api/people/1/')
  13. .then(res => res.json())
  14. .then(luke => console.log(luke))
  15. } catch (err) {
  16. console.log(err);
  17. }
  18. }
  19. dataLuke();
  20. /* fetch('https://jsonplaceholder.typicode.com/todos/1')
  21. .then(response => response.json())
  22. .then(json => console.log(json)) */
  23. let url = 'https://jsonplaceholder.typicode.com/users';
  24. /*
  25. let dataFetch = async function(url){
  26. let response = await fetch(url);
  27. let json = response.json();
  28. return await json;
  29. }
  30. dataFetch(url).then(data => {
  31. tableFromJson(root, data)
  32. }); */
  33. /* let dataFrom =async function() {
  34. await fetch('https://jsonplaceholder.typicode.com/todos/1')
  35. .then(response => response.json())
  36. .then(json =>json)
  37. return json;
  38. }
  39. console.log(dataFrom()); */
  40. async function loadJson(url) {
  41. let response = await fetch(url);
  42. if (response.status == 200) {
  43. let json = await response.json();
  44. return json;
  45. }
  46. throw new Error(response.status);
  47. }
  48. /*
  49. Напишите функцию для отображения любого JSON в форме таблицы. Функция должна принимать два параметра:
  50. DOM - элемент, в котором строится таблица
  51. JSON, который нужно отобразить. */
  52. //const json = '{"user": "semen", "result":true, "age":42, "sex": "men"}';
  53. function tableFromJsonS(rootElement, json) {
  54. let table = document.createElement('table');
  55. table.style.border = 'solid black 1px';
  56. let data = JSON.parse(json);
  57. for (let [key, value] of Object.entries(data)) {
  58. let tr = document.createElement('tr');
  59. let td = document.createElement('td');
  60. let td1 = document.createElement('td');
  61. td.innerText = key;
  62. tr.append(td)
  63. td1.innerText = value;
  64. tr.append(td1)
  65. table.append(tr);
  66. }
  67. rootElement.append(table);
  68. }
  69. //tableFromJsonS(root, json);
  70. /*
  71. fetch improved
  72. Расширить функцию отображения:
  73. Если одно из полей строка или массив.
  74. Если строки или строка содержат в себе https://swapi.dev/api/
  75. То выводить вместо текста строки кнопку, при нажатии на которую:
  76. делается fetch данных по этой ссылке
  77. функция отображения запускает сама себя(рекурсивно) для отображения новых данных в том же элементе. */
  78. const json = '{"user": "semen", "result":true, "age":42, "sex": "men"}';
  79. function tableFromJson(rootElement) {
  80. let table = document.createElement('table');
  81. table.style.border = 'solid black 1px';
  82. function tableCells(data) {
  83. for (let [key, value] of Object.entries(data)) {
  84. let tr = document.createElement('tr');
  85. let td = document.createElement('td');
  86. let td1 = document.createElement('td');
  87. if (typeof value == 'object') {
  88. let btn = document.createElement('button');
  89. btn.innerText = Object.keys(value);
  90. btn.onclick = () => tableCells(value);
  91. td.append(btn);
  92. } else {
  93. td.innerText = key;
  94. td1.innerText = value;
  95. }
  96. tr.append(td)
  97. tr.append(td1)
  98. table.append(tr);
  99. }
  100. rootElement.append(table);
  101. };
  102. loadJson(url).then(data => {
  103. data.forEach(tableCells(data));
  104. })
  105. }
  106. tableFromJson(root);
  107. /* myfetch
  108. Используя XMLHTTPRequest, напишите промисифицированную функцию myfetch, т. е.
  109. функцию, которая возвращает промис, и работает схоже с fetch, только в один этап: */
  110. function myfetch(url) {
  111. console.log('start')
  112. return new Promise(function (resolve, reject) {
  113. const request = new XMLHttpRequest()
  114. request.open('GET', url, true)
  115. request.send();
  116. request.onreadystatechange = function () {
  117. if (request.readyState != 4) {
  118. return;
  119. }
  120. if (request.status == 200) {
  121. resolve(JSON.parse(request.responseText))
  122. } else {
  123. reject = () => console.log('Error: ' + request.status + ', ' + request.statusText);
  124. }
  125. }
  126. })
  127. };
  128. myfetch('https://jsonplaceholder.typicode.com/users')
  129. .then(luke => console.log(luke))
  130. /* race
  131. Используя Promise.race запустите запрос на API (myfetch) параллельно с delay. По результату определите, что было быстрее, запрос по сети, или определенный интервал времени. Подберите параметр delay так, что бы результат был неизвестен изначально, и при многократных запусках быстрее был то delay, то myfetch. */
  132. let delay = new Promise(function(resolve, reject){
  133. setTimeout(resolve, Math.random()*300) //or near by 250ms
  134. })
  135. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  136. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  137. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  138. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  139. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  140. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  141. //testing fetch and promises
  142. async function f() {
  143. let promise = myfetch('https://jsonplaceholder.typicode.com/users');
  144. let result = await promise; // будет ждать, пока промис не выполнится (*)
  145. return result; // "готово!"
  146. }
  147. let t = f();
  148. console.log(t)
  149. async function showAvatar() {
  150. let githubResponse = await fetch(`https://api.github.com/users/serg1557733`);
  151. let githubUser = await githubResponse.json();
  152. console.log(githubUser);
  153. let img = document.createElement('img');
  154. img.src = githubUser.avatar_url;
  155. img.style.borderRadius = '100%';
  156. document.body.append(img);
  157. await new Promise((resolve, reject) => setTimeout(resolve, 3000));
  158. img.remove();
  159. return githubUser;
  160. }
  161. showAvatar();