17_Async_Promise.html 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>17_Async_Promise</title>
  7. </head>
  8. <body>
  9. <div class="wrapper" style="display: inline-flex">
  10. <div id="div1" style="margin: 10px; min-width: 400px; border: 2px solid red"></div>
  11. <div id="div2" style="margin: 10px; border: 2px solid red"></div>
  12. </div>
  13. <script>
  14. //
  15. let objectToDom = function (domElement, person) {
  16. //
  17. const urlConst = "http://swapi.dev/api/";
  18. let setBtn = function (domEl, value) {
  19. let btn = document.createElement("button");
  20. btn.append(value.slice(urlConst.length));
  21. domEl.append(btn);
  22. // debugger;
  23. btn.onclick = () => {
  24. div2.removeChild(div2.firstChild);
  25. fetch(value)
  26. .then((res) => res.json())
  27. .then((luke) => objectToDom(div2, luke));
  28. };
  29. };
  30. let table = document.createElement("table");
  31. table.setAttribute("border", "1");
  32. domElement.append(table);
  33. // console.log(person);
  34. for (item in person) {
  35. let tr = document.createElement("tr");
  36. table.append(tr);
  37. let th = document.createElement("th");
  38. tr.append(th);
  39. th.append(item);
  40. let td = document.createElement("td");
  41. tr.append(td);
  42. if (typeof person[item] == "string") {
  43. if (person[item].startsWith(urlConst)) {
  44. setBtn(td, person[item]);
  45. } else td.append(person[item]);
  46. } else {
  47. if (Array.isArray(person[item])) {
  48. for (val of person[item]) {
  49. if (val.startsWith(urlConst)) {
  50. setBtn(td, val);
  51. } else td.append(val);
  52. }
  53. }
  54. }
  55. }
  56. };
  57. fetch("https://swapi.dev/api/people/1/")
  58. .then((res) => res.json())
  59. .then((luke) => {
  60. objectToDom(div1, luke);
  61. objectToDom(div2, luke);
  62. console.log(luke);
  63. });
  64. // fetch("https://swapi.dev/api/people/1/")
  65. // .then((res) => res.json())
  66. // .then((luke) => objectToDom(div2, luke));
  67. //
  68. //
  69. // -------------------myfetch
  70. // Используя XMLHTTPRequest, напишите промисифицированную функцию myfetch,
  71. // т. е. функцию, которая возвращает промис, и работает схоже с fetch, только в один этап:
  72. let myfetch = function (url) {
  73. return new Promise(function (ok, fail) {
  74. let xhr = new XMLHttpRequest();
  75. xhr.open("GET", url, true);
  76. xhr.responseType = "json";
  77. xhr.onload = function () {
  78. if ((this.status = 200)) ok(this.response);
  79. else fail(new Error(`Ошибка. Статус ${this.status}: ${this.statusText}`));
  80. };
  81. // xhr.onerror = function (e) {
  82. // fail(`Ошибка2 ${this.status}: ${this.statusText} +++ ${e}`);
  83. // };
  84. xhr.addEventListener("error", () => fail(new Error("Network error")));
  85. xhr.send(null);
  86. });
  87. };
  88. myfetch("https://swa---------pi.dev/api/people/1/").then(
  89. (luke) => console.log(luke),
  90. (error) => alert(error)
  91. );
  92. myfetch("https://swapi.dev/api/people/1/").then(
  93. (luke) => console.log(JSON.stringify(luke)),
  94. (error) => alert(error)
  95. );
  96. //
  97. // -------------------Promise.race
  98. //Используя Promise.race запустите запрос на API (myfetch) параллельно с delay.
  99. // По результату определите, что было быстрее, запрос по сети, или определенный
  100. // интервал времени. Подберите параметр delay так, что бы результат был неизвестен изначально,
  101. // и при многократных запусках быстрее был то delay, то myfetch.
  102. //
  103. document.body.insertAdjacentHTML("beforeEnd", "<br>60-65 ms ");
  104. let msInput = document.createElement("input");
  105. msInput.type = "number";
  106. msInput.placeholder = "задержка, ms";
  107. document.body.append(msInput);
  108. let btn = document.createElement("button");
  109. btn.append("Race (смотри консоль)");
  110. document.body.append(btn);
  111. let faster = document.createElement("input");
  112. faster.placeholder = "Кто быстрее?";
  113. document.body.append(faster);
  114. btn.onclick = function () {
  115. let delay = (ms) => new Promise((resolve) => setTimeout(() => resolve(`Delay ${ms} ms`), ms));
  116. console.log("GO!");
  117. Promise.race([delay(+msInput.value), myfetch("https://swapi.dev/api/people/1/")]).then(
  118. (ok) => {
  119. faster.value = ok;
  120. console.log(ok);
  121. },
  122. (error) => alert(error)
  123. );
  124. };
  125. //
  126. //
  127. //
  128. </script>
  129. </body>
  130. </html>