// fetch basic // С помощью следующего кода считать и вывести информацию о Люке Скайвокере: // fetch('https://swapi.dev/api/people/1/') // .then(res => res.json()) // .then(luke => console.log(luke)) // Напишите функцию для отображения любого JSON в форме таблицы. // Функция должна принимать два параметра: // * DOM - элемент, в котором строится таблица // * JSON, который нужно отобразить. // fetch improved // Расширить функцию отображения: // * Если одно из полей строка или массив. // * Если строки или строка содержат в себе https://swapi.dev/api/, то выводить вместо текста строки кнопку, // при нажатии на которую: // * делается fetch данных по этой ссылке // * функция отображения запускает сама себя(рекурсивно) // для отображения новых данных в том же элементе. fetch('https://swapi.dev/api/people/1/') .then(res => res.json()) .then(luke => renderTable(document.body, luke)) function renderTable(parent, obj) { let $table = document.createElement('table') for (let key in obj) { let $tr = document.createElement('tr') let $td = document.createElement('td') let $td2 = document.createElement('td') if (Array.isArray(obj[key])) { for (let item of obj[key]) { let newTable = document.createElement('table') let newTr = document.createElement('tr') let newTd = document.createElement('td') linkChecker(item, newTd) newTr.append(newTd) newTable.append(newTr) $td2.append(newTable) } } else { linkChecker(obj[key], $td2) } $td.innerHTML = key $tr.append($td, $td2) $table.appendChild($tr) } parent.appendChild($table) } function linkChecker(str, container) { if (typeof str === 'string') { if (str.includes('https://swapi.dev/api/')) { let btn = document.createElement('button') btn.innerHTML = 'Show' btn.onclick = () => { fetch(str).then(r => r.json()) .then(r => renderTable(container, r)) } container.append(btn) } else { container.innerHTML = str } } } // myfetch // Используя XMLHTTPRequest, напишите промисифицированную функцию myfetch, т.е. функцию, которая // возвращает промис, и работает схоже с fetch, только в один этап: // myfetch('https://swapi.dev/api/people/1/') // .then(luke => console.log(luke)) // Функция myfetch ожидает что ответ будет в формате JSON (используйте JSON.parse(response.text)) // В случае ошибок (request.onerror или request.status не 200) не забудьте вызывать reject // function myfetch(url){ // return new Promise(function (resolve, reject){ // const xhr = new XMLHTTPRequest() // ///... // }) // } myfetch('https://swapi.dev/api/people/10/') .then(kenobi => console.log(kenobi)) function myfetch(url) { return new Promise(function (resolve, reject) { const xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState != 4) { return; } if (xhr.status == 200) { resolve(JSON.parse(xhr.responseText)); } else { reject('error') } } xhr.open('GET', url, true); xhr.send(null); }) }