ソースを参照

Make promises hometasks

Bonyant 2 年 前
コミット
3ec86f41fa
3 ファイル変更158 行追加0 行削除
  1. 16 0
      10/index.html
  2. 109 0
      10/index.js
  3. 33 0
      10/styles.css

+ 16 - 0
10/index.html

@@ -0,0 +1,16 @@
+<!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" />
+    <link rel="stylesheet" href="styles.css" />
+    <title>JavaScript Promises 1 part</title>
+  </head>
+  <body>
+    <div class="container">
+      <div id="blockTable"></div>
+    </div>
+    <script src="index.js"></script>
+  </body>
+</html>

+ 109 - 0
10/index.js

@@ -0,0 +1,109 @@
+// fetch basic && fetch improved
+
+async function getData(link) {
+  try {
+    const data = await fetch(link);
+    const person = await data.json();
+    return person;
+  } catch (e) {
+    console.log(e);
+  }
+}
+
+async function showTable(block, link) {
+  let readyTable = await buildTable(block, await getData(link));
+  let blockEl = document.querySelector(".container");
+  blockEl.appendChild(readyTable);
+}
+
+async function buildTable(el, json) {
+  let newTable = document.createElement("table");
+  newTable.className = ".tableFetch";
+  newTable.setAttribute("border", "1");
+  let tds = 0;
+  let btns = 0;
+  for (let [key, value] of Object.entries(json)) {
+    tds++;
+    let th = document.createElement("th");
+    let td = document.createElement("td");
+    td.id = `${key}TD${tds}`;
+    let tr = document.createElement("tr");
+    th.innerText = key;
+    if (typeof value === "string" && value.includes("http")) {
+      btns++;
+      let btn = document.createElement("button");
+      btn.id = `${key}Btn${btns}`;
+      btn.innerText = value;
+      td.innerHTML = btn.outerHTML;
+    } else if (Array.isArray(value) && value.length !== 0) {
+      for (let el of value) {
+        btns++;
+        let btn = document.createElement("button");
+        btn.id = `${key}Btn${btns}`;
+        btn.innerText = el;
+        td.innerHTML += `${btn.outerHTML}\n`;
+      }
+    } else {
+      td.innerText = value.length > 0 ? value : "No value";
+    }
+    tr.appendChild(th);
+    tr.appendChild(td);
+    newTable.append(tr);
+  }
+
+  let buttons = newTable.querySelectorAll("button");
+  if (buttons.length !== 0) {
+    for (let btn of buttons) {
+      btn.onclick = async () => {
+        let appendTable = document.createElement("table");
+        appendTable.setAttribute("border", "1");
+        let btnTR = btn.closest("tr");
+        let btnTH = btnTR.firstChild;
+        btnTR.className = `${btnTH.textContent}TR`;
+        let data = btn.textContent;
+        btn.remove();
+        let TR = document.querySelector(`.${btnTR.className}`);
+        appendTable.appendChild(TR);
+        await showTable(appendTable, data);
+      };
+    }
+  }
+  el.appendChild(newTable);
+  return el;
+}
+
+showTable(blockTable, "https://swapi.dev/api/people/1/");
+
+// myfetch
+
+function myfetch(url) {
+  return new Promise(function (resolve, reject) {
+    const request = new XMLHttpRequest();
+    request.open("GET", url, true);
+    request.onreadystatechange = function () {
+      if (request.readyState != 4) {
+        return;
+      }
+      if (request.status == 200) {
+        resolve(JSON.parse(request.responseText));
+      } else {
+        reject(request.status + ", " + request.statusText);
+      }
+    };
+    request.send();
+  });
+}
+
+myfetch("https://swapi.dev/api/people/1/").then((data) =>
+  console.log(`MyFetch response:`, data)
+);
+
+// race
+
+const delay = async (ms) => new Promise((resolve) => setTimeout(resolve, ms));
+
+Promise.race([delay(1000), myfetch("https://swapi.dev/api/people/1/")]).then(
+  (value) => {
+    console.log(`First loaded promise: `, value);
+  }
+);

+ 33 - 0
10/styles.css

@@ -0,0 +1,33 @@
+table {
+  margin-bottom: 20px;
+  border: 1px solid #2e2e2e;
+  border-collapse: collapse;
+}
+table th {
+  font-weight: normal;
+  text-align: center;
+  border: 1px solid #2e2e2e;
+  padding: 5px;
+}
+table td {
+  font-weight: normal;
+  text-align: center;
+  border: 1px solid #2e2e2e;
+  padding: 5px;
+}
+
+button {
+  text-decoration: none;
+  display: inline-block;
+  border-radius: 45px;
+  font-family: "Montserrat", sans-serif;
+  font-size: 11px;
+  text-transform: uppercase;
+  text-align: center;
+  letter-spacing: 3px;
+  font-weight: 600;
+  color: #524f4e;
+  background: white;
+  box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1);
+  transition: 0.3s;
+}