App.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // fetch basic
  2. // С помощью следующего кода считать и вывести информацию о Люке Скайвокере:
  3. // fetch('https://swapi.dev/api/people/1/')
  4. // .then(res => res.json())
  5. // .then(luke => console.log(luke))
  6. // Напишите функцию для отображения любого JSON в форме таблицы.
  7. // Функция должна принимать два параметра:
  8. // * DOM - элемент, в котором строится таблица
  9. // * JSON, который нужно отобразить.
  10. // fetch improved
  11. // Расширить функцию отображения:
  12. // * Если одно из полей строка или массив.
  13. // * Если строки или строка содержат в себе https://swapi.dev/api/, то выводить вместо текста строки кнопку,
  14. // при нажатии на которую:
  15. // * делается fetch данных по этой ссылке
  16. // * функция отображения запускает сама себя(рекурсивно)
  17. // для отображения новых данных в том же элементе.
  18. fetch('https://swapi.dev/api/people/1/')
  19. .then(res => res.json())
  20. .then(luke => renderTable(document.body, luke))
  21. function renderTable(parent, obj) {
  22. let $table = document.createElement('table')
  23. for (let key in obj) {
  24. let $tr = document.createElement('tr')
  25. let $td = document.createElement('td')
  26. let $td2 = document.createElement('td')
  27. if (Array.isArray(obj[key])) {
  28. for (let item of obj[key]) {
  29. let newTable = document.createElement('table')
  30. let newTr = document.createElement('tr')
  31. let newTd = document.createElement('td')
  32. linkChecker(item, newTd)
  33. newTr.append(newTd)
  34. newTable.append(newTr)
  35. $td2.append(newTable)
  36. }
  37. }
  38. else {
  39. linkChecker(obj[key], $td2)
  40. }
  41. $td.innerHTML = key
  42. $tr.append($td, $td2)
  43. $table.appendChild($tr)
  44. }
  45. parent.appendChild($table)
  46. }
  47. function linkChecker(str, container) {
  48. if (typeof str === 'string') {
  49. if (str.includes('https://swapi.dev/api/')) {
  50. let btn = document.createElement('button')
  51. btn.innerHTML = 'Show'
  52. btn.onclick = () => {
  53. fetch(str).then(r => r.json())
  54. .then(r => renderTable(container, r))
  55. }
  56. container.append(btn)
  57. } else {
  58. container.innerHTML = str
  59. }
  60. }
  61. }
  62. // myfetch
  63. // Используя XMLHTTPRequest, напишите промисифицированную функцию myfetch, т.е. функцию, которая
  64. // возвращает промис, и работает схоже с fetch, только в один этап:
  65. // myfetch('https://swapi.dev/api/people/1/')
  66. // .then(luke => console.log(luke))
  67. // Функция myfetch ожидает что ответ будет в формате JSON (используйте JSON.parse(response.text))
  68. // В случае ошибок (request.onerror или request.status не 200) не забудьте вызывать reject
  69. // function myfetch(url){
  70. // return new Promise(function (resolve, reject){
  71. // const xhr = new XMLHTTPRequest()
  72. // ///...
  73. // })
  74. // }
  75. myfetch('https://swapi.dev/api/people/10/')
  76. .then(kenobi => console.log(kenobi))
  77. function myfetch(url) {
  78. return new Promise(function (resolve, reject) {
  79. const xhr = new XMLHttpRequest();
  80. xhr.onreadystatechange = function () {
  81. if (xhr.readyState != 4) {
  82. return;
  83. }
  84. if (xhr.status == 200) {
  85. resolve(JSON.parse(xhr.responseText));
  86. } else {
  87. reject('error')
  88. }
  89. }
  90. xhr.open('GET', url, true);
  91. xhr.send(null);
  92. })
  93. }