123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- function createBtn(text) {
- let btn = document.createElement('button')
- btn.innerText = `${text}`
- return btn
- }
- function drawObjTable(parent, obj) {
- let table = document.createElement('table')
- table.border = 1
- table.style.border = '5px double grey'
- let closeRow = document.createElement('tr')
- let closeTd = document.createElement('td')
- closeTd.style.border = 'none'
-
- let closeBtn = createBtn('Close table')
- closeBtn.style.backgroundColor = 'firebrick'
- closeBtn.style.color = 'white'
- closeBtn.onclick = () => parent.removeChild(table)
- closeTd.append(closeBtn)
- closeRow.append(closeTd)
- table.append(closeRow)
- for (let key in obj) {
- let tr = document.createElement('tr')
- let tdKey = document.createElement('td')
- tdKey.innerText = key
- tdKey.style.backgroundColor = 'black'
- tdKey.style.color = 'white'
- let tdValue = document.createElement('td')
- tdValue.style.backgroundColor = 'grey'
- tdValue.style.color = 'whitesmoke'
- if (obj[key].constructor.name === 'Array') {
- for (let item of obj[key]) {
- if (typeof item === 'string' && /^(https:\/\/|http:\/\/)/.test(item)) {
- let btn = createBtn(`Loading...`)
- btn.disabled = true
- fetch(item)
- .then((res) => {
- if(res.ok) {
- return res.json()
- } else {
- throw new Error()
- }
- })
- .then(obj => {
- btn.disabled = false
- btn.innerText = obj[Object.keys(obj)[0]]
- btn.onclick = () => { drawObjTable(container, obj) }
- })
- .catch(e => console.warn('something bad happened ', e))
- tdValue.append(btn)
- } else {
- tdValue.innerText = item
- }
- }
- } else if (typeof obj[key] === 'string' && /^(https:\/\/|http:\/\/)/.test(obj[key])) {
- let btn = createBtn(key)
- btn.disabled = true
-
- fetch(obj[key])
- .then((res) => {
- if(res.ok) {
- return res.json()
- } else {
- throw new Error()
- }
- })
- .then(obj => {
- btn.disabled = false
- btn.innerText = obj[Object.keys(obj)[0]]
- btn.onclick = () => { drawObjTable(container, obj) }
- })
- .catch(e => console.warn('something bad happened ', e))
- tdValue.append(btn)
- } else {
- tdValue.innerText = obj[key]
- }
- tr.append(tdKey, tdValue)
- table.append(tr)
- }
- parent.append(table)
- }
- let container = document.createElement('div')
- document.body.append(container)
- //luke skywalker
- fetch('https://swapi.dev/api/people/1/')
- .then((res) => {
- if(res.ok) {
- return res.json()
- } else {
- throw new Error()
- }
- })
- .then(luke => {
- drawObjTable(container, luke)
- })
- .catch((e) => console.warn('something bad happpened ', e))
- // myFetch
- function myFetch(url) {
- return new Promise((resolve, reject) => {
- const xhr = new XMLHttpRequest()
- xhr.open('GET', url, true)
- xhr.onreadystatechange = () => {
- if (xhr.readyState != 4){
- return;
- }
-
- if (xhr.status == 200){
- resolve(JSON.parse(xhr.response))
- }
- else {
- reject(new Error(`smth bad happened during request to ${url}. ${xhr.responseText}`))
- }
- }
- xhr.onerror = () => {
- reject(new Error(`smth bad happened during request to ${url}. ${xhr.responseText}`))
- }
- xhr.send()
- })
- }
- //darth vader
- myFetch('https://swapi.dev/api/people/4/')
- .then((res) => {
- drawObjTable(container, res)
- })
- .catch((e) => {console.warn('error occured!', e)})
- //let builtIn = fetch('https://swapi.dev/api/people/1/')
- let mine = myFetch('https://swapi.dev/api/people/4/')
- //при нормальном инете сначал побеждает дилей потом майн всегда
- //let delayPromise = delay(300)
- //Promise.race([builtIn, mine]).then((value) => console.log('fastest', value))
- function delay(ms) {
- return new Promise((resolve, reject) => {
- setTimeout(resolve, ms);
- });
- }
- //вот таким образом выходит по разному при условии что симулируется slow 3g
- //по разному но не 50 на 50.
- let delayPromise = delay(4299)
- Promise.race([delayPromise, mine]).then((value) => console.log('fastest:', value || 'delay'))
|