index.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. // ДЗ: Промисы
  2. // задание 1 fetch basic
  3. {
  4. function displayJSONInTable(DOM, JSON) {
  5. // создаем таблицу
  6. let table = document.createElement('table');
  7. // обрабатываем JSON и создаем строки таблицы
  8. for (let key in JSON) {
  9. let row = document.createElement('tr');
  10. // создаем ячейку с названием свойства
  11. let keyCell = document.createElement('td');
  12. keyCell.innerText = key;
  13. row.appendChild(keyCell);
  14. // создаем ячейку со значением свойства
  15. let valueCell = document.createElement('td');
  16. valueCell.innerText = JSON[key];
  17. row.appendChild(valueCell);
  18. // добавляем строку в таблицу
  19. table.appendChild(row);
  20. }
  21. // добавляем таблицу в DOM
  22. DOM.appendChild(table);
  23. }
  24. }
  25. {
  26. // Чтобы отобразить JSON в форме таблицы, нужно вызвать функцию displayJSON с соответствующими аргументами (Этот код сначала получает данные о Люке Скайвоке через запрос fetch, а затем отображает их в форме таблицы в контейнере body.):
  27. fetch('https://swapi.dev/api/people/1/')
  28. .then((res) => res.json())
  29. .then((luke) => displayJSON(document.body, luke));
  30. }
  31. // задание 2 fetch improved
  32. {
  33. function createTable(parent, data) {
  34. // Создаем таблицу
  35. const table = document.createElement('table');
  36. // Создаем строку с заголовками
  37. const thead = document.createElement('thead');
  38. const headRow = document.createElement('tr');
  39. for (const key in data) {
  40. const th = document.createElement('th');
  41. th.textContent = key;
  42. headRow.appendChild(th);
  43. }
  44. thead.appendChild(headRow);
  45. table.appendChild(thead);
  46. // Создаем тело таблицы
  47. const tbody = document.createElement('tbody');
  48. for (const key in data) {
  49. const td = document.createElement('td');
  50. const value = data[key];
  51. if (typeof value === 'string' || Array.isArray(value)) {
  52. if (value.includes('https://swapi.dev/api/')) {
  53. // Создаем кнопку
  54. const button = document.createElement('button');
  55. button.textContent = 'Load data';
  56. button.addEventListener('click', () => {
  57. fetch(value)
  58. .then((res) => res.json())
  59. .then((newData) => {
  60. // Очищаем тело таблицы
  61. while (tbody.firstChild) {
  62. tbody.removeChild(tbody.firstChild);
  63. }
  64. // Обновляем таблицу
  65. createTable(tbody, newData);
  66. });
  67. });
  68. td.appendChild(button);
  69. } else {
  70. td.textContent = value;
  71. }
  72. } else {
  73. // Создаем таблицу с вложенными данными
  74. createTable(td, value);
  75. }
  76. tbody.appendChild(td);
  77. }
  78. table.appendChild(tbody);
  79. // Добавляем таблицу в родительский элемент
  80. parent.appendChild(table);
  81. }
  82. }
  83. // задание 3 race
  84. {
  85. const delay = (time) => new Promise((resolve) => setTimeout(resolve, time));
  86. const myFetch = (url) => fetch(url).then((res) => res.json());
  87. Promise.race([delay(Math.random() * 1000), myFetch('https://swapi.dev/api/people/1/')]).then(
  88. (result) => {
  89. if (result.name) {
  90. console.log(`myFetch was faster`);
  91. } else {
  92. console.log(`delay was faster`);
  93. }
  94. },
  95. );
  96. }
  97. // задание 4 Promisify: confirm
  98. {
  99. function confirmPromise(text) {
  100. return new Promise((resolve, reject) => {
  101. if (confirm(text)) {
  102. resolve();
  103. } else {
  104. reject();
  105. }
  106. });
  107. }
  108. confirmPromise('Промисы это сложно?').then(
  109. () => console.log('не так уже и сложно'),
  110. () => console.log('respect за усидчивость и внимательность'),
  111. );
  112. }
  113. // задание 5 Promisify: prompt
  114. {
  115. function promptPromise(text) {
  116. return new Promise((resolve, reject) => {
  117. const response = prompt(text);
  118. if (response) {
  119. resolve(response);
  120. } else {
  121. reject();
  122. }
  123. });
  124. }
  125. promptPromise('Как тебя зовут?')
  126. .then((name) => console.log(`Тебя зовут ${name}`))
  127. .catch(() => console.log('Ну зачем морозиться, нормально же общались'));
  128. }
  129. // задание 6 Promisify: LoginForm
  130. {
  131. class LoginForm {
  132. constructor(parent) {
  133. this.parent = parent;
  134. }
  135. createForm() {
  136. return new Promise((resolve, reject) => {
  137. const form = document.createElement('form');
  138. const loginInput = document.createElement('input');
  139. loginInput.type = 'text';
  140. loginInput.placeholder = 'Логин';
  141. form.append(loginInput);
  142. const password = new Password(form, false);
  143. password.onChange = () =>
  144. (loginButton.disabled = !(loginInput.value && password.getValue()));
  145. const loginButton = document.createElement('button');
  146. loginButton.textContent = 'Войти';
  147. loginButton.disabled = true;
  148. loginButton.addEventListener('click', () => {
  149. resolve({ login: loginInput.value, password: password.getValue() });
  150. });
  151. form.append(loginButton);
  152. this.parent.append(form);
  153. });
  154. }
  155. }
  156. function loginPromise(parent) {
  157. const form = new LoginForm(parent);
  158. return form.createForm();
  159. }
  160. loginPromise(document.body).then(({ login, password }) =>
  161. console.log(`Вы ввели ${login} и ${password}`),
  162. );
  163. }