main.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. //Асинхронщина в JS, callback hell
  2. //Задание
  3. let request = new XMLHttpRequest();
  4. let selectCountry = document.querySelector("#country");
  5. let selectCity = document.querySelector("#city");
  6. request.open("GET", "https://raw.githubusercontent.com/David-Haim/CountriesToCitiesJSON/master/countriesToCities.json", true);
  7. request.addEventListener("readystatechange", function() {
  8. if(request.readyState == 4) {
  9. let countriesToCitiesJSON = JSON.parse(request.response);
  10. drawCountriesInSelect(countriesToCitiesJSON);
  11. drawCityInSelect(countriesToCitiesJSON);
  12. selectCountry.addEventListener("input", function() {
  13. drawCityInSelect(countriesToCitiesJSON);
  14. });
  15. }
  16. });
  17. request.send();
  18. let drawCountriesInSelect = function(obj) {
  19. for(let [key, value] of Object.entries(obj)) {
  20. let option = document.createElement("option");
  21. option.text = key;
  22. selectCountry.appendChild(option);
  23. }
  24. }
  25. let drawCityInSelect = function(obj) {
  26. let countryIndex = selectCountry.selectedIndex;
  27. let str = "";
  28. for(let city of Object.entries(obj)[countryIndex][1]) {
  29. str += `<option>${city}</option>`;
  30. }
  31. selectCity.innerHTML = str;
  32. }
  33. //Javascript Async: Promise Homework
  34. //fetch basic
  35. //fetch improved
  36. let container = document.querySelector(".contanier");
  37. function Table(container, url) { // Конструктор для сбора таблицы
  38. this.url = url;
  39. let getObjForFetchRequest = function(url) { // Получаю obj в зависимости от url, по факту эта функция запускает всю цепочку событий по отрисовки таблицы
  40. fetch(url).then(res => res.json()).then(obj => createTable(obj));
  41. };
  42. let valueCreators = { // Тут я буду проверять кем является value, в цыкле for у функции createTable, строка или массив
  43. String(value) {
  44. if(value.includes("https://swapi.dev/api/")) { // Проверка на наличие строки "https://swapi.dev/api/" в value, если true то ложу в кнопку
  45. return `<button>${value}</button>`;
  46. } else {
  47. return value;
  48. }
  49. },
  50. Array(value) {
  51. let str = "";
  52. for(let item of value) {
  53. if(item.includes("https://swapi.dev/api/")) {
  54. str += `<button>${item}</button><br>`;
  55. } else {
  56. str += item;
  57. }
  58. }
  59. return str;
  60. }
  61. };
  62. let createTable = function(obj) { // Собсна функция которая собирает таблицу
  63. let str = "";
  64. str += "<table>";
  65. for(let [key, value] of Object.entries(obj)) {
  66. let valueCreatorFunction = valueCreators[value.constructor.name];
  67. str += `<tr><td>${key}</td><td>${valueCreatorFunction(value)}</td></tr>`; // Запуск valueCreatorFunction что бы корректно отрисовать строку или массив
  68. };
  69. str += "</table>";
  70. container.innerHTML = str;
  71. };
  72. getObjForFetchRequest(url); // Одноразовый вызов функции для запуска цепочки по отрисовки таблицы
  73. let changeObjForFetchRequest = function(evt) { // Функция для слушателя событий "click" который будет запускать getObjForFetchRequest с url который находиться внутри кнопки
  74. if(evt.target.tagName == "BUTTON") {
  75. getObjForFetchRequest(evt.target.textContent);
  76. }
  77. }
  78. container.addEventListener("click", changeObjForFetchRequest);
  79. };
  80. let table = new Table(container, "https://swapi.dev/api/people/1/");
  81. //myfetch
  82. function myfetch(url){
  83. return new Promise(function (resolve, reject){
  84. let xhr = new XMLHttpRequest();
  85. xhr.open("GET", url, true);
  86. xhr.addEventListener("readystatechange", function() {
  87. if(xhr.readyState == 4) { // Если все хорошо то нужно передать в resolve объект
  88. resolve(JSON.parse(xhr.response));
  89. } else if (xhr.status > 500) { // Если все не очень хорошо то вывести информацию об ошибке
  90. reject(`Ошибка: ${xhr.status} ${xhr.statusText}`);
  91. }
  92. });
  93. xhr.send();
  94. })
  95. }
  96. myfetch('https://swapi.dev/api/people/1/')
  97. .then(luke => console.log(luke));
  98. //race
  99. let delay = new Promise((resolve, reject) => {
  100. setTimeout(() => resolve("delay"), 500); // Подобрать параметр delay так, что бы результат был неизвестен изначально не возможно, иногда myfetch выполняется 1-2 сек, а иногда 9 сек
  101. });
  102. Promise.race([myfetch('https://swapi.dev/api/people/1/'), delay]).then(value => console.log(value));