//1. fetch basic // Исследуйте сайт swapi.dev, рассмотрите JSON-ы, которые предоставляются этим сервисом // (например: https://swapi.dev/api/people/1/, https://swapi.dev/api/people/2/, https://swapi.dev/api/starships/12/ // С помощью следующего кода считать и вывести информацию о Люке Скайвокере: // Напишите функцию для отображения любого JSON в форме таблицы. Функция должна принимать два параметра: // DOM - элемент, в котором строится таблица // JSON, который нужно отобразить. // { // const person1 = 'https://swapi.dev/api/people/1/'; // const person2 = 'https://swapi.dev/api/people/2/'; // const person3 = 'https://swapi.dev/api/starships/12/'; // // let table = document.createElement('table') // table.border = 1 // document.body.append(table) // // function fetchBbasic (dom, source) { // // fetch(source).then(res => res.json()) // .then(luke => { // for (let [key, value] of Object.entries(luke)) { // let tr = document.createElement("tr") // table.append(tr) // // let row = document.createElement('td') // row.innerText = key // tr.append(row) // // let rowValue = document.createElement('td') // rowValue.innerText = value // tr.append(rowValue) // // } // console.log(luke) // }) // } // fetchBbasic(table, person1) // } // 2. Расширить функцию отображения: // Если одно из полей строка или массив. // Если строки или строка содержат в себе https://swapi.dev/api/ // То выводить вместо текста строки кнопку, при нажатии на которую: // делается fetch данных по этой ссылке // функция отображения запускает сама себя(рекурсивно) для отображения новых данных в том же элементе. // { // fetch('https://swapi.dev/api/people/1/') // .then(res => res.json()) // .then(luke => { // personTable(document.body, luke); // }) // // function personTable(domElement, jsonElement, elemForRemoval) { // let table = document.createElement('table'); // table.border = 1 // //elemForRemoval?.remove(); // domElement.append(table); // // for (let [key, value] of Object.entries(jsonElement)) { // let tr = document.createElement("tr") // table.append(tr) // let row = document.createElement('td') // row.innerText = key // tr.append(row) // // let rowValue = document.createElement('td') // rowValue.innerText = value // tr.append(rowValue) // // if (typeof key === 'string' && value.includes('https://swapi.dev/api/')) { // linkButton(value, rowValue) // } // else if (Array.isArray(value)) { // value.forEach(element => { // linkButton(element,rowValue) // }) // } // } // } // // function linkButton(value, rowValue) { // let button = document.createElement('button'); // button.innerText = 'OPEN LINK'; // button.onclick = () => { // fetch(value) // .then(res => res.json()) // .then(data => { // personTable(rowValue, data, button); // }) // }; // rowValue.append(button); // } // } //3. race // Используя Promise.race запустите запрос на API (swapi.dev) параллельно с delay. По результату определите, что было // быстрее, запрос по сети, или определенный интервал времени. Подберите параметр delay так, что бы результат был // неизвестен изначально, и при многократных запусках быстрее был то delay, то myfetch. // { // let myFetch = new Promise(resolve => fetch('https://swapi.dev/api/people/1/').then(res => res.json()) // .then(luke => { // console.log(luke) // }) ) // // function delay(ms){ // function executor(fulfill, reject) { // setTimeout(() => fulfill(ms), ms) } // return new Promise(executor) // } // Promise.race([myFetch, delay(80)]).then((value) => { // console.log(value); // }); // // } //4. Promisify: confirm // Промисифицируйте confirm. Напишите функцию, которая возвращает промис, который переходит в состояние fulfilled при // нажатии "OK" и реджектится при нажатии "Cancel". Функция должна принимать строку для confirm: // { // function confirmPromise(text){ // function executor(fulfill, reject){ // if (confirm(text) === true) { // fulfill() // } else { // reject() // } // } // return new Promise(executor) // } // // confirmPromise('Промисы это сложно?').then(() => console.log('не так уже и сложно'), // () => console.log('respect за усидчивость и внимательность')) // } //5. Promisify: prompt // Аналогично предыдующему заданию промисифицируйте prompt. В случае нажатия "ОК" промис резолвится и его результатом // становится текст, введенный пользователем в окне prompt. В случае нажатия "Отмены" - промис реджектится. Параметром // функции будет текст сообщения в prompt // { // function promptPromise(text) { // function executor(fulfill, reject) { // let answer = prompt(text); // if (answer) { // fulfill(answer); // } else { // reject(); // } // } // return new Promise(executor); // } // // promptPromise("Как тебя зовут?").then(name => console.log(`Тебя зовут ${name}`), // () => console.log('Ну зачем морозиться, нормально же общались')) // } //6. Promisify: LoginForm // Промисифицируйте конструктор LoginForm. В промисифицированную функцию передается DOM-элемент - родитель для формы, // В колбэке, предназначенном для получения логина и пароля в момент нажатия кнопки "Login...", который вы назначаете в // объекте LoginForm, зарезолвите промис. Результатом промиса должен быть объект с ключами login и password, ключи // должны содержать значения полей ввода. // { // function loginPromise (parent) { // function executor (resolve, reject) { // const form = new LoginForm(parent, false) // form.inputButtonOnclick = function () { // resolve ({login: this.getLogin(), password: this.getPass()}) // } // } // return new Promise(executor) // } // // loginPromise(document.body).then(({login, password}) => console.log(`Вы ввели ${login} и ${password}`)) // // // function LoginForm(parent, passOpenDefault){ // function Password(parent, open) { // // const inputPass = document.createElement('input') // parent.append(inputPass) // const checkboxPass = document.createElement('input') // checkboxPass.type = 'checkbox' // parent.append(checkboxPass) // // this.setValue = (value) => { // inputPass.value = value // if (typeof this.onChange === 'function') this.onChange(this.getValue()) // запускается по событию oninput в поле ввода, передает текст в колбэк // } //задает значение // this.getValue = () => inputPass.value //читает значение // this.setOpen = (open) => { // if (open) { // checkboxPass.checked = true // inputPass.type = "text" // } // if (!open) { // checkboxPass.checked = false // inputPass.type = "password" // } // if (typeof this.onOpenChange === 'function') this.onOpenChange(this.getOpen()) // запускается по изменению состояния открытости пароля // } //задает открытость текста в поле ввода // this.getOpen = () => checkboxPass.checked //читает открытость текста в поле ввода // // this.setOpen(open) // inputPass.oninput = () => this.setValue(this.getValue()) // checkboxPass.oninput = () => this.setOpen(this.getOpen()) // // } // // const LoginForm = document.createElement('div') // parent.append(LoginForm) // // const inputLogin = document.createElement('input') // LoginForm.append(inputLogin) // // let p = new Password(LoginForm, passOpenDefault) // // const inputButton = document.createElement('input') // inputButton.type = 'button' // inputButton.value = 'войти' // LoginForm.append(inputButton) // inputButton.disabled = true // // p.onChange = () => checkButtonDisabled() // inputLogin.oninput = () => checkButtonDisabled() // // function checkButtonDisabled () { // if (p.getValue() && inputLogin.value) inputButton.disabled = false // else inputButton.disabled = true // } // // this.getLogin = () => inputLogin.value // this.setLogin = (value) => { // inputLogin.value = value // checkButtonDisabled() // // } // this.getPass = () => p.getValue() // this.setPass = (value) => { // p.setValue(value) // checkButtonDisabled() // } // // inputButton.onclick = () => { // if (typeof this.inputButtonOnclick === 'function') this.inputButtonOnclick() //функция при нажатии на кнопку войти // } // } // }