JavaScript виконання коду JavaScript підключення зовнішнього файлу JavaScript console.log JavaScript змінні і константи JavaScript типи даних JavaScript операції зі змінними JavaScript перетворення даних JavaScript масиви JavaScript умовні конструкції JavaScript цикли JavaScript функції JavaScript область видимості змінних JavaScript замикання і функції IIFE JavaScript Паттерн Модуль JavaScript рекурсивні функції JavaScript перевизначення функцій JavaScript hoisting JavaScript передача параметрів за значенням і за посиланням JavaScript стрілочні функції JavaScript ООП Object JavaScript ООП вкладені об'єкти і масиви в об'єктах JavaScript ООП перевірка наявності і перебір методів і властивостей JavaScript ООП об'єкти у функціях JavaScript ООП конструктори об'єктів JavaScript ООП розширення об'єктів. prototype JavaScript ООП інкапсуляція JavaScript ООП Функція як об'єкт. Методи call і apply JavaScript ООП спадкування JavaScript ООП Ключове слово this JavaScript ООП Object destructuring JavaScript ООП класи JavaScript ООП Date. Робота з датами JavaScript Об'єкт Math. математичні операції JavaScript Об'єкт Array. Робота з масивами JavaScript ООП об'єкт Number JavaScript String JavaScript String Об'єкт RegExp. Регулярні вирази JavaScript String Регулярні вирази в методах String JavaScript String Синтаксис регулярних виразів JavaScript Робота з браузером і BOM JavaScript діалогові вікна JavaScript Історія браузера. об'єкт history JavaScript об'єкт location JavaScript об'єкт navigator JavaScript таймери JavaScript DOM Введення JavaScript DOM Об'єкт document. Пошук елементів JavaScript DOM Властивості об'єкта document JavaScript DOM Об'єкт Node. Навігація по DOM JavaScript DOM Створення, додавання і видалення елементів веб-сторінки JavaScript DOM Об'єкт Element. управління елементами JavaScript DOM Зміна стилю елементів JavaScript події. Введення в обробку подій. JavaScript події обробники JavaScript події. об'єкт Event JavaScript події. поширення подій JavaScript події миші JavaScript події клавіатури JavaScript FORMS. Форми і їх елементи JavaScript FORMS. Кнопки JavaScript FORMS. текстові поля JavaScript FORMS. Прапорці та перемикачі JavaScript FORMS. Список select JavaScript JSON JavaScript зберігання даних. cookie JavaScript зберігання даних. Web Storage JavaScript Collection. Ітератори JavaScript Collection. Генератори JavaScript Collection. Множина Set JavaScript Collection. Map JavaScript Collection. WeakSet і WeakMap JavaScript AJAX. XMLHttpRequest JavaScript AJAX. Відправка даних JavaScript AJAX. Promise в Ajax-запитах

JavaScript AJAX. Promise в Ajax-запитах


Promise в Ajax-запитах

Як видно з прикладів минулих тем для створення ajax-запитів використовуються фактично повторюючі виклики, що відрізняються лише деталями - рядком запиту, функціями обробки відповіді. І цілком було б не погано створити для всіх дій, пов'язаних з асинхронним ajax-запитом, створити якусь загальну абстракцію і потім використовувати її при наступних зверненнях до сервера.

Для створення додаткового рівня абстракції в даному випадку зручно застосовувати об'єкт Promise , який обгортає асинхронну операцію в один об'єкт, який дозволяє визначити дії, що виконуються при успішному або невдалому виконанні цієї операції.

Інкапсулюємо асинхронний запит в об'єкт Promise :

function get(url) {

  return new Promise(function(succeed, fail) {

    var request = new XMLHttpRequest();
    request.open("GET", url, true);

    request.addEventListener("load", function() {

      if (request.status < 400)
        succeed(request.response);
      else
        fail(new Error("Request failed: " + request.statusText));
    });

    request.addEventListener("error", function() {
      fail(new Error("Network error"));
    });

    request.send();

  });

}

Метод get отримує в якості параметра адресу ресурсу сервера і повертає об'єкт Promise . Конструктор Promise як параметр приймає функцію зворотного виклику, яка в свою чергу приймає два параметри - дві функції: одна виконується при успішній обробці запиту, а друга - при невдалій.

Припустимо, на сервері буде розміщений файл users.json наступного змісту:

[
    {
        "name": "Tom",
        "age": 34
    }, {
        "name": "Sam",
        "age": 32
    }, {
        "name": "Bob",
        "age": 26
    }
]

Тепер викличемо метод get для здійснення запиту до сервера:

get("http://localhost:8080/users.json").then(function(text) {

  console.log(text);

}, function(error) {

  console.log("Error!!!");
  console.log(error);

});

Для обробки результату об'єкта Promise викликається метод then() , який приймає два параметри: функцію, що викликається при успішному виконанні запиту, і функцію, яка викликається при невдалому виконанні запиту. Метод then() також повертає об'єкт Promise . Тому при необхідності ми можемо застосувати до його результату ланцюжок викликів методу then : get().then().then()... . наприклад:

get("http://localhost:8080/users.json").then(function(response) {
    console.log(response);
    return JSON.parse(response);
}).then(function(data) {
    console.log(data[0]);
});

В даному випадку функція в першому виклику методу then отримує відповідь сервера і повертає розпарсені дані у вигляді масиву за допомогою функції JSON.parse() .

Функція в другому виклику then отримує ці розпарсені дані, тобто масив, у вигляді параметра (повертається значення попереднього then є параметром для подальшого then ). Потім перший елемент масиву виводиться на консоль.

Для обробки помилок ми ми можемо використовувати метод catch () , в який передається функція обробки помилок:

get("http://localhost:8080/users.jsn").then(function(response) {

    console.log(response);
    return JSON.parse(response);

}).then(function(data) {

    console.log(data[0]);

}).catch(function(error){

    console.log("Error!!!");
    console.log(error);

});

Подібним чином через Promise можна було б відправляти дані на сервер:

function post(url, requestuestBody) {

  return new Promise(function(succeed, fail) {

    var request = new XMLHttpRequest();

    request.open("POST", url, true);
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    request.addEventListener("load", function() {

      if (request.status < 400)
        succeed(request.responseText);
      else
        fail(new Error("Request failed: " + request.statusText));
    });

    request.addEventListener("error", function() {
      fail(new Error("Network error"));
    });

    request.send(requestuestBody);

  });
}
 
var user = {
    name: "Tom&Tim",
    age: 23
};

// дані для відправки
var params = "name=" + user.name + "&age="+user.age;
 

post("http://localhost:8080/postdata.php", params).then(function(text) {

  console.log(text);

}, function(error) {

  console.log(error);

});

Наш партнер:
beta test mp3 playlist downloader