<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <script>
//-------------------fetch basic

// let DOM = document.body;
// fetch('https://swapi.py4e.com/api/people/1/')
//   .then(res => res.json(),
//         err => console.log("ERROR"))
//     .then(luke => createTable(DOM, luke));

// function createTable(DOM, JSON) {
//     console.log(DOM, JSON);
//     const tableEl = document.createElement("table");
//     tableEl.border = 1;

//     for(let [key, value] of Object.entries(JSON)) {
//         createTr(key,value);
//     }

//     DOM.append(tableEl);

//     function createTr(td1,td2) {
//         const trEl = document.createElement("tr");
//         const td1El = document.createElement("td");
//         const td2El = document.createElement("td");
//         td1El.innerHTML = td1;
//         if(typeof td2 ==="object") {
//             const ulEl = document.createElement("ul");
//             for(let value of td2) {
//                 const liEl = document.createElement("li");
//                 liEl.innerText = value;
//                 ulEl.appendChild(liEl);
//             }
//             td2El.appendChild(ulEl);
//         } else {
//             td2El.innerHTML = td2;  
//         }
//         trEl.append(td1El,td2El);
//         tableEl.append(trEl);
//     }

// }

//-------------------fetch improved
// let DOM = document.body;
// myFetch(DOM);

// function myFetch(dom) {
// fetch('https://swapi.py4e.com/api/people/1/')
//   .then(res => res.json(),
//         err => console.log("ERROR"))
//     .then(luke => createTable(dom, luke));
// }

// function createTable(DOM, JSON) {
//     console.log(DOM, JSON);
//     const tableEl = document.createElement("table");
//     tableEl.border = 1;
//     for(let [key, value] of Object.entries(JSON)) {
//         createTr(key,value);
//     }
//     DOM.append(tableEl);

//     function createTr(td1,td2) {
//         const trEl = document.createElement("tr");
//         const td1El = document.createElement("td");
//         const td2El = document.createElement("td");
//         td1El.innerHTML = td1;
//         if(typeof td2 ==="number") td2 = td2.toString();
//         if(typeof td2!=="object"&&!td2.indexOf("https://swapi.py4e.com/api/")) td2 = [td2];
//         if(typeof td2 ==="object") {
//             const ulEl = document.createElement("ul");
//             for(let value of td2) {
//                 const liEl = document.createElement("li");
//                 const buttonEl = document.createElement("button");
//                 buttonEl.innerText = value;
//                 buttonEl.onclick = () => {
//                     buttonEl.hidden = true;
//                     myFetch(buttonEl.parentElement);
//                 }
//                 liEl.appendChild(buttonEl);
//                 ulEl.appendChild(liEl);
//             }
//             td2El.appendChild(ulEl);
//         } else {
//             td2El.innerHTML = td2;
//         }
//         trEl.append(td1El,td2El);
//         tableEl.append(trEl);
//     }
// }
//-------------------myfetch

// myfetch('https://swapi.py4e.com/api/people/1/').then(luke => console.log(luke));

// function myfetch(url){
//     return new Promise(function (resolve, reject){
//         const xhr = new XMLHttpRequest();
//         xhr.open('GET', url, true);
//         xhr.responseType = "json";
//         xhr.onload = function(){
//             if (xhr.status == 200){
//                 resolve(xhr.response);
//             }
//             else {
//                 reject(`ERROR ${xhr.status} - ${xhr.statusText}`);
//             }
//         }
//         xhr.onerror = () => reject(`ERROR ${xhr.status} - ${xhr.statusText}`);
//         xhr.send();
//     })
// }
//-------------------race

Promise.race([myfetch('https://swapi.py4e.com/api/people/1/'),delay(30)]).then((value) => console.log(value));


function myfetch(url){
    return new Promise(function (resolve, reject){
        const xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = "json";
        xhr.onload = function(){
            if (xhr.status == 200){
                resolve(xhr.response);
            }
            else {
                reject(`ERROR ${xhr.status} - ${xhr.statusText}`);
            }
        }
        xhr.onerror = () => reject(`ERROR ${xhr.status} - ${xhr.statusText}`);
        xhr.send();
    })
}

function delay(ms) {
    return new Promise(function(resolve,reject) {
        setTimeout(resolve,ms,"delay");
    })
}
    </script>
</body>
</html>