Асинхронні функції в ES7

3 хв. читання

Синхронне програмування - це просто. Ви просто викликаєте функцію, отримуєте значення, що вона повертає і продовжуєте робити все, що вам потрібно. Асинхронне програмування, з іншого боку, дуже незвичне. Так, у нас є Promise, який значно спрощує взаємодію з асинхронними функціями. Тим не менш, це не елегантне рішення. Отже, чи є спосіб краще? Є! У цій статті я розповім вам про async і await функції в ES7, а також поясню, як вони можуть змінити спосіб роботи з асинхронними завданнями.

Традиційний підхід

Перш ніж заглиблюватися в деталі асинхронних функцій ES7, давайте розглянемо традиційний спосіб роботи з Promise.

getPromise()

    function getPromise(value){
    	return new Promise(resolve,reject){
    		//симуляція async завдання
    		setTimeout(function(){
    			if(value % 2 === 0){
    				resolve('Resolved!');
    			}
    			else{
    				reject('Rejected!');
    			}
    		},5000);
    	}
    }

Припустимо, що функція getPromise() щось робить асинхронно і видає Rejected/Resolved після 5 секунд. Щоб використати функцію, ви зробите щось на зразок цього:

    function caller(){
    	getPromise(2).then(successCallback,failureCallback);
    }

Якщо ми маємо resolve, викликається successCallback. Якщо reject \- failureCallback. Тепер, давайте подивимося, як цей код може бути покращений за допомогою нових асинхронних функцій в ES7.

Нові можливості ES7

ES7 вводить дві нові ключові слова : async і await. await, як випливає з назви, дозволяє очікувати на асинхронні функції. Щоб використовувати ключове слово await ваші функції повинні бути відзначені як async. Давайте подивимося, як ми можемо змінити наш попередній фрагмент використовувати await.

    async function caller(){
    	var message = await getPromise(2);
    	console.log(message);
    	return message;
    }

При використанні await, ви чекаєте на асинхронні функції у неблокуючий спосіб. У цьому випадку ваша функція caller зупиняється на функції getPromise(), але не блокується. Як тільки функція getPromise() виконана, значення повертається і зберігається в змінній message. Це зрозумілий, простий і дуже схожий на синхронний спосіб програмування. Також зверніть увагу, що функція caller повертає message так само, як і значення. Оскільки ви зазначили функцію як async, значення буде обгорнуте і повернуте як Promise.

Але як щодо відмови? Що робити, якщо getPromise() відхиляє Promise? Для обробки відмов потрібно обернути ваш код у try/catch

    async function caller(){
    	try{
    		var message = await getPromise(2);
    		console.log(message);
    		return message;
    	}
    	catch(err){
    		console.log(err.message); //rejected
    	}
    }

У цьому випадку, якщо функція getPromise() надсилає відмову, то управління передається в блок catch. Відхилене значення може бути отримане від об'єкта err.

Висновок

ES7 синтаксис для роботи з Promise - це, безумовно, простий і потужний інструмент. ES6 не повністю реалізований у всіх браузерах, про підтримку асинхронних функцій ES7 на даний момент тим більше нічого невідомо. Якщо ви не можете більше чекати, скористайтесь компілятором Traceur. У разі, якщо Ви не в курсі, Traceur - це компілятор, який приймає ваш ES6 код і перетворює його у ES5 еквівалент. Ви також повинні включити експериментальні функції в компіляторі.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.7K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація