/* fetch basic & fetch improved*/ let result = document.body fetch('https://swapi.py4e.com/api/people/1/') .then(res => res.json()) .then(luke => createTable(result, luke)); function createTable(result, JSON) { let table = document.createElement("table"); function createCol(title, value) { let tr = document.createElement("tr"); let td = document.createElement("td"); let td1 = document.createElement("td"); td.innerHTML = title; if (typeof value === "object") { if (Array.isArray(value)) { value.forEach(elem => { td1.appendChild(elem) } ); } else { td1.appendChild(value) } } else { td1.innerHTML = value; } table.append(tr); tr.append(td, td1); } for (let [key, value] of Object.entries(JSON)) { createCol(key, link(value)); } result.append(table); table.border = 1; } function link(str, container) { if (typeof str === 'string') { if (str.includes('https://')) { let btn = document.createElement('button') btn.innerHTML = 'Go' btn.onclick = () => { fetch(str).then(r => r.json()) .then(r => createTable(btn.parentElement, r)) } return btn } else { return str } } else if (typeof str === 'object') { let arrStr = str.map(item => { if (item.includes('https://')) { let btn = document.createElement('button') btn.innerHTML = 'Go' btn.onclick = () => { fetch(item).then(r => r.json()) .then(r => createTable(btn.parentElement, r)) } return btn } else { return item } }) return arrStr } else { return str } } /* myfetch */ myfetch('https://swapi.dev/api/people/1/') .then(luke => console.log(luke)) 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('err') } } xhr.open('GET', url , true); xhr.send(null); }) } /* race */ let luke1 = new Promise((resolve, reject) => { fetch('https://swapi.dev/api/people/1/') .then(res => res.json()) .then(luke => console.log(luke)) }); let delay = new Promise((resolve, reject) => { setTimeout(resolve, Math.random() * 1000, 'delay'); }); Promise.race([luke1, delay]).then((x) => { console.log(x); });