Початок роботи з обіцянками JavaScript
Асинхронний код корисно для виконання завдань, які є трудомісткий але, звичайно, це не позбавлений мінусів. Асинхронний код використовується функції зворотного виклику для обробки його результатів, однак функції зворотного виклику не може повернути значення що типові функції JavaScript можуть.
Таким чином, вони не тільки знімають нашу здатність контролювати виконання функції але й зробити обробка помилок трохи клопоту. Ось де Обіцянка
об'єкт приходить, оскільки він прагне заповнити деякі з вибоїни в асинхронному кодуванні.
Обіцянка
технічно a стандартний внутрішній об'єкт у JavaScript, що означає, що він приходить вбудований в JavaScript. Він використовується для представлення можливий результат асинхронного кодового блоку (або причина, чому код не вдався) і має методи керування виконання асинхронного коду.
Синтаксис
Ми можемо створити екземпляр Обіцянка
об'єкт за допомогою новий
ключове слово:
new Promise (функція (вирішення, відхилення) );
Функція передається як параметр до Обіцяння ()
конструктор відомий як виконавця. Він містить асинхронний код і має два параметри Функція
тип, називають вирішувати
і відхилити
функції (докладніше про них коротко).
Держави Обіцянка
об'єкт
The початковий стан a Обіцянка
називається об'єкт очікує. У цьому стані виникає результат асинхронного обчислення не існує.
Початковий стан очікування змінюється на виконані Стан, коли обчислення успішним. The результат обчислення доступний у цьому стані.
У випадку асинхронного обчислення не вдається, Обіцянка
об'єкт рухається до відхилено стан від початкового очікує стан. У цьому стані причина невдачі обчислення (тобто повідомлення про помилку).
Перейти з очікує до виконані стан, вирішити ()
це називається. Перейти з очікує до відхилено стан, відхилити ()
це називається.
The потім
і улов
методів
Коли держава зміни з очікує до виконані, обробник подій Обіцянка
об'єкта потім
метод виконується. І, коли держава зміни з очікує до відхилено, обробник подій Обіцянка
об'єкта улов
метод виконується.
Приклад 1
“Не розголошується” код
Припустимо, що є hello.txt
файл, що містить “Здрастуйте” слово. Ось як ми можемо написати запит AJAX отримати цей файл і показати його зміст, без використання Обіцянка
об'єкт:
функція getTxt () xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) випадок 200: document.write (this.response); перерву; випадок 404: викинути файл "Не знайдено"; default: викинути "Не вдалося отримати файл"; catch (err) console.log (err); getTxt ();
Якщо вміст файлу був успішно завантажено, тобто. код стану відповіді - 200, текст відповіді записується в документ. Якщо файл не знайдено (статус 404), a “Файл не знайдено” повідомлення про помилку. В іншому випадку a повідомлення про загальну помилку із зазначенням невдачі вилучення файлу.
“Пропонується” код
Тепер давайте Пропонуйте вказаний вище код:
function getTxt () return new Promise (функція (вирішення, відхилення) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.send (); xhr.onload = function () switch (this.status) випадок 200: вирішити (this.response); випадок 404: відхилити ('File Not Found'); за замовчуванням: відхилити ('Failed to отримати файл ');;); getTxt (). (функція (txt) document.write (txt);). catch (функція (err) console.log (err););
The getTxt ()
функція тепер закодована повернути новий екземпляр Обіцянка
об'єкт, і його виконавець виконує функцію асинхронного коду від раніше.
Коли Код стану відповіді - 200, Обіцянка
є виконані від виклику вирішити ()
(відповідь передається як параметр вирішити ()
). Коли код стану 404 або якийсь інший, Обіцянка
є відхилено використання відхилити ()
(з відповідним повідомленням про помилку в якості параметра відхилити ()
).
The обробники подій для потім()
і улов()
методів з Обіцянка
об'єкт додано наприкінці.
Коли Обіцянка
є виконані, обробник потім()
Запускається метод. Його аргумент параметр, що передається від вирішити ()
. Усередині обробника події, текст відповіді (отриманий як аргумент) є записується в документ.
Коли Обіцянка
є відхилено, обробник подій улов()
Запускається метод, реєстрація помилки.
The Основна перевага вищезгаданої версії коду є обробка помилок. Замість того, щоб кидати Uncaught Винятки навколо - як у Non-Promisified версії - відповідні повідомлення про відмову повертаються та реєструються.
Але це не просто повернення з повідомлення про відмову але й результат асинхронного обчислення це може бути дійсно вигідним для нас. Щоб побачити це, нам потрібно розширити наш приклад.
Приклад 2
“Не розголошується” код
Замість того, щоб просто відображати текст з hello.txt
, я хочу поєднати його з “Світ” слово і відобразити його на екрані після тайм-ауту 2 секунди. Ось код, який я використовую:
функція getTxt () xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) випадок 200: document.write (concatTxt (this.response)); перерву; випадок 404: викинути файл "Не знайдено"; default: викинути "Не вдалося отримати файл"; catch (err) console.log (err); функція concatTxt (res) setTimeout (function () return (res + 'World'), 2000); getTxt ();
На код стану 200, concatTxt ()
покликана функція об'єднати текст відповіді з “Світ” слово перед записом у документ.
Але, цей код не буде працювати за бажанням. The setTimeout ()
функція зворотного виклику не може повернути пов'язаний рядок. Що буде надруковано в документі undefined
тому що це що concatTxt ()
повертається.
“Пропонується” код
Отже, щоб коди працювали, давайте Пропонуйте вказаний вище код, у тому числі concatTxt ()
:
function getTxt () return new Promise (функція (вирішення, відхилення) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.send (); xhr.onload = function () switch (this.status) випадок 200: вирішити (this.response); випадок 404: відхилити ('File Not Found'); за замовчуванням: відхилити ('Failed to отримати файл ');;); функція concatTxt (txt) return new Promise (функція (вирішення, відхилення) setTimeout (function () вирішення (txt + 'World');, 2000);); getTxt (), потім ((txt) => повернути concatTxt (txt);), потім ((txt) => document.write (txt);). catch ((err) => console. log (err););
Так як getTxt ()
, concatTxt ()
функції повертає нове Обіцянка
об'єкт замість об'єднаного тексту. The Обіцянка
повернуто concatTxt ()
є вирішується всередині функції зворотного виклику setTimeout ()
.
Ближче до кінця вищевказаного коду, обробник події першого потім()
Метод виконується, коли Обіцянка
з getTxt ()
є виконані, тобто, коли файл успішно завантажено. Усередині цього обробника, concatTxt ()
це називається і Обіцянка
повернуто concatTxt ()
повертається.
Обробник події другого потім()
Метод виконується, коли Обіцянка
повернуто concatTxt ()
є виконані, тобто 2 секунди закінчення тайм-ауту і вирішити ()
це називається з конкатенированним рядком як параметр.
Нарешті, улов()
вловлює всі повідомлення про винятки і відмови з обох обіцянок.
У цій Провідній версії “Привіт Світ” рядок буде успішно роздруковано до документа.