123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- //Javascript Async: Promise Homework
- /* fetch basic
- С помощью следующего кода считать и вывести информацию о Люке Скайвокере:
- fetch('https://swapi.dev/api/people/1/')
- .then(res => res.json())
- .then(luke => console.log(luke)) */
- fetch('https://swapi.dev/api/people/1/')
- .then(res => res.json())
- .then(luke => console.log(luke))
- let dataLuke = async () => {
- try {
- await fetch('https://swapi.dev/api/people/1/')
- .then(res => res.json())
- .then(luke => console.log(luke))
- } catch (err) {
- console.log(err);
- }
- }
- dataLuke();
- /* fetch('https://jsonplaceholder.typicode.com/todos/1')
- .then(response => response.json())
- .then(json => console.log(json)) */
- let url = 'https://jsonplaceholder.typicode.com/users';
- /*
- let dataFetch = async function(url){
- let response = await fetch(url);
- let json = response.json();
- return await json;
- }
- dataFetch(url).then(data => {
- tableFromJson(root, data)
- }); */
- /* let dataFrom =async function() {
- await fetch('https://jsonplaceholder.typicode.com/todos/1')
- .then(response => response.json())
- .then(json =>json)
- return json;
- }
- console.log(dataFrom()); */
- async function loadJson(url) {
- let response = await fetch(url);
- if (response.status == 200) {
- let json = await response.json();
- return json;
- }
- throw new Error(response.status);
- }
- /*
- Напишите функцию для отображения любого JSON в форме таблицы. Функция должна принимать два параметра:
- DOM - элемент, в котором строится таблица
- JSON, который нужно отобразить. */
- //const json = '{"user": "semen", "result":true, "age":42, "sex": "men"}';
- function tableFromJsonS(rootElement, json) {
- let table = document.createElement('table');
- table.style.border = 'solid black 1px';
- let data = JSON.parse(json);
- for (let [key, value] of Object.entries(data)) {
- let tr = document.createElement('tr');
- let td = document.createElement('td');
- let td1 = document.createElement('td');
- td.innerText = key;
- tr.append(td)
- td1.innerText = value;
- tr.append(td1)
- table.append(tr);
- }
- rootElement.append(table);
- }
- //tableFromJsonS(root, json);
- /*
- fetch improved
- Расширить функцию отображения:
- Если одно из полей строка или массив.
- Если строки или строка содержат в себе https://swapi.dev/api/
- То выводить вместо текста строки кнопку, при нажатии на которую:
- делается fetch данных по этой ссылке
- функция отображения запускает сама себя(рекурсивно) для отображения новых данных в том же элементе. */
- const json = '{"user": "semen", "result":true, "age":42, "sex": "men"}';
- function tableFromJson(rootElement) {
- let table = document.createElement('table');
- table.style.border = 'solid black 1px';
- function tableCells(data) {
- for (let [key, value] of Object.entries(data)) {
- let tr = document.createElement('tr');
- let td = document.createElement('td');
- let td1 = document.createElement('td');
- if (typeof value == 'object') {
- let btn = document.createElement('button');
- btn.innerText = Object.keys(value);
- btn.onclick = () => tableCells(value);
- td.append(btn);
- } else {
- td.innerText = key;
- td1.innerText = value;
- }
- tr.append(td)
- tr.append(td1)
- table.append(tr);
- }
- rootElement.append(table);
- };
- loadJson(url).then(data => {
- data.forEach(tableCells(data));
- })
- }
- tableFromJson(root);
- /* myfetch
- Используя XMLHTTPRequest, напишите промисифицированную функцию myfetch, т. е.
- функцию, которая возвращает промис, и работает схоже с fetch, только в один этап: */
- function myfetch(url) {
- console.log('start')
- return new Promise(function (resolve, reject) {
- const request = new XMLHttpRequest()
- request.open('GET', url, true)
- request.send();
- request.onreadystatechange = function () {
- if (request.readyState != 4) {
- return;
- }
- if (request.status == 200) {
- resolve(JSON.parse(request.responseText))
- } else {
- reject = () => console.log('Error: ' + request.status + ', ' + request.statusText);
- }
- }
- })
- };
- myfetch('https://jsonplaceholder.typicode.com/users')
- .then(luke => console.log(luke))
- /* race
- Используя Promise.race запустите запрос на API (myfetch) параллельно с delay. По результату определите, что было быстрее, запрос по сети, или определенный интервал времени. Подберите параметр delay так, что бы результат был неизвестен изначально, и при многократных запусках быстрее был то delay, то myfetch. */
- let delay = new Promise(function(resolve, reject){
- setTimeout(resolve, Math.random()*300) //or near by 250ms
- })
- console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
- console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
- console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
- console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
- console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
- console.log(Promise.race([delay, myfetch('https://jsonplaceholder.typicode.com/users')])) ;
- //testing fetch and promises
- async function f() {
- let promise = myfetch('https://jsonplaceholder.typicode.com/users');
- let result = await promise; // будет ждать, пока промис не выполнится (*)
- return result; // "готово!"
- }
-
- let t = f();
- console.log(t)
- async function showAvatar() {
- let githubResponse = await fetch(`https://api.github.com/users/serg1557733`);
- let githubUser = await githubResponse.json();
- console.log(githubUser);
- let img = document.createElement('img');
- img.src = githubUser.avatar_url;
- img.style.borderRadius = '100%';
- document.body.append(img);
- await new Promise((resolve, reject) => setTimeout(resolve, 3000));
- img.remove();
- return githubUser;
- }
-
- showAvatar();
|