script.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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. //Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
  49. /* let dataResp = await Promise.all([
  50. fetch('https://swapi.dev/api/people/1/'),
  51. fetch('https://swapi.dev/api/people/1/'),
  52. fetch('https://jsonplaceholder.typicode.com/todos/1')
  53. ])
  54. console.log(dataResp); */
  55. /*
  56. Напишите функцию для отображения любого JSON в форме таблицы. Функция должна принимать два параметра:
  57. DOM - элемент, в котором строится таблица
  58. JSON, который нужно отобразить. */
  59. //const json = '{"user": "semen", "result":true, "age":42, "sex": "men"}';
  60. function tableFromJsonS(rootElement, json) {
  61. let table = document.createElement('table');
  62. table.style.border = 'solid black 1px';
  63. let data = JSON.parse(json);
  64. for (let [key, value] of Object.entries(data)) {
  65. let tr = document.createElement('tr');
  66. let td = document.createElement('td');
  67. let td1 = document.createElement('td');
  68. td.innerText = key;
  69. tr.append(td)
  70. td1.innerText = value;
  71. tr.append(td1)
  72. table.append(tr);
  73. }
  74. rootElement.append(table);
  75. }
  76. //tableFromJsonS(root, json);
  77. /*
  78. fetch improved
  79. Расширить функцию отображения:
  80. Если одно из полей строка или массив.
  81. Если строки или строка содержат в себе https://swapi.dev/api/
  82. То выводить вместо текста строки кнопку, при нажатии на которую:
  83. делается fetch данных по этой ссылке
  84. функция отображения запускает сама себя(рекурсивно) для отображения новых данных в том же элементе. */
  85. const json = '{"user": "semen", "result":true, "age":42, "sex": "men"}';
  86. function tableFromJson(rootElement) {
  87. let table = document.createElement('table');
  88. table.style.border = 'solid black 1px';
  89. function tableCells(data) {
  90. for (let [key, value] of Object.entries(data)) {
  91. let tr = document.createElement('tr');
  92. let td = document.createElement('td');
  93. let td1 = document.createElement('td');
  94. if (typeof value == 'object') {
  95. tableCells(value)
  96. let btn = document.createElement('button');
  97. btn.innerText = Object.keys(value);
  98. this.onclick = console.log(value);
  99. td.append(btn);
  100. } else {
  101. td.innerText = key;
  102. td1.innerText = value;
  103. }
  104. tr.append(td)
  105. tr.append(td1)
  106. table.append(tr);
  107. }
  108. rootElement.append(table);
  109. };
  110. loadJson(url).then(data => {
  111. data.forEach(tableCells(data));
  112. })
  113. }
  114. //tableFromJson(root);
  115. /* myfetch
  116. Используя XMLHTTPRequest, напишите промисифицированную функцию myfetch, т. е.
  117. функцию, которая возвращает промис, и работает схоже с fetch, только в один этап: */
  118. function myfetch(url) {
  119. console.log('start')
  120. return new Promise(function (resolve, reject) {
  121. const request = new XMLHttpRequest()
  122. request.open('GET', url, true)
  123. request.send();
  124. request.onreadystatechange = function () {
  125. if (request.readyState != 4) {
  126. return;
  127. }
  128. if (request.status == 200) {
  129. resolve(JSON.parse(request.responseText))
  130. } else {
  131. reject = () => console.log('Error: ' + request.status + ', ' + request.statusText);
  132. }
  133. }
  134. })
  135. };
  136. myfetch('https://jsonplaceholder.typicode.com/users')
  137. .then(luke => console.log(luke))
  138. /* race
  139. Используя Promise.race запустите запрос на API (myfetch) параллельно с delay. По результату определите, что было быстрее, запрос по сети, или определенный интервал времени. Подберите параметр delay так, что бы результат был неизвестен изначально, и при многократных запусках быстрее был то delay, то myfetch. */
  140. let delay = new Promise(function(resolve, reject){
  141. setTimeout(resolve, Math.random()*300) //or near by 250ms
  142. })
  143. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  144. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  145. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  146. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  147. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
  148. console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;