Асинхронне програмування є ключовим аспектом в сучасному JavaScript, яке дозволяє писати ефективний, неблокуючий код для роботи з асинхронними операціями, такими як HTTP-запити, взаємодія з базами даних чи файловими системами. У цій статті ми розглянемо основні поняття асинхронного програмування на JavaScript, зокрема Promises, async/await та обробку помилок.
Асинхронне програмування і Promises
Що таке Promises?
Promises є однією з основних конструкцій асинхронного програмування в JavaScript. Вони дозволяють представляти результат асинхронної операції як об’єкт, який можна обробити в майбутньому.
const promise = new Promise((resolve, reject) => {
// асинхронна операція
});
Обробка результату
Для обробки результату Promise використовуються методи .then()
та .catch()
.
promise
.then((result) => {
console.log('Успішно:', result);
})
.catch((error) => {
console.error('Помилка:', error);
});
Використання async/await
Async/await – це синтаксичний цукор, що спрощує роботу з Promises. Щоб використати async/await, потрібно оголосити функцію з ключовим словом async
та використати await
перед Promise.
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log('Data:', data);
} catch (error) {
console.error('Error:', error);
}
}
fetchData();
Обробка помилок
Обробка помилок з Promises
Для обробки помилок в Promises використовується метод .catch()
.
promise
.then((result) => {
console.log('Успішно:', result);
})
.catch((error) => {
console.error('Помилка:', error);
});
Обробка помилок з async/await
Для обробки помилок з async/await використовується блок try-catch.
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log('Data:', data);
} catch (error) {
console.error('Error:', error);
}
}
fetchData();
Ланцюжки Promises
Послідовна обробка
Promises дозволяють створювати послідовні ланцюжки, використовуючи метод .then()
.
fetchData()
.then((data) => processData(data))
.then((result) => displayResult(result))
.catch((error) => console.error('Error:', error));
Паралельна обробка
Для паралельної обробки Promises можна використати метод Promise.all()
.
Promise.all([fetchData1(), fetchData2()])
.then(([result1, result2]) => console.log('Results:', result1, result2))
.catch((error) => console.error('Error:', error));
Як працює async/await з циклами
Послідовне виконання
Для послідовного виконання async/await з циклами можна використати for
або for...of
.
async function fetchAllData(urls) {
const results = [];
for (const url of urls) {
const data = await fetchData(url);
results.push(data);
}
return results;
}
Паралельне виконання
Для паралельного виконання async/await з циклами можна використати Promise.all()
.
async function fetchAllData(urls) {
const promises = urls.map((url) => fetchData(url));
const results = await Promise.all(promises);
return results;
}
Додаткові приклади використання Promises та async/await
Завантаження даних з API
Приклад використання Promises для завантаження даних з API
function fetchData(url) {
return new Promise((resolve, reject) => {
fetch(url)
.then((response) => {
if (response.ok) {
return response.json();
} else {
throw new Error(`Error: ${response.status}`);
}
})
.then((data) => resolve(data))
.catch((error) => reject(error));
});
}
const apiUrl = 'https://jsonplaceholder.typicode.com/todos/1';
fetchData(apiUrl)
.then((data) => console.log('Data:', data))
.catch((error) => console.error('Error:', error));
Приклад використання async/await для завантаження даних з API:
async function fetchData(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Error: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
throw error;
}
}
const apiUrl = 'https://jsonplaceholder.typicode.com/todos/1';
fetchData(apiUrl)
.then((data) => console.log('Data:', data))
.catch((error) => console.error('Error:', error));
Як зробити послідовний запит за допомогою Promises та async/await
Приклад послідовного виконання запитів до API за допомогою Promises.
const apiUrl1 = 'https://jsonplaceholder.typicode.com/todos/1';
const apiUrl2 = 'https://jsonplaceholder.typicode.com/todos/2';
fetchData(apiUrl1)
.then((data1) => {
console.log('Data1:', data1);
return fetchData(apiUrl2);
})
.then((data2) => console.log('Data2:', data2))
.catch((error) => console.error('Error:', error));
Приклад послідовного виконання запитів до API за допомогою async/await.
async function fetchAllData() {
try {
const data1 = await fetchData(apiUrl1);
console.log('Data1:', data1);
const data2 = await fetchData(apiUrl2);
console.log('Data2:', data2);
} catch (error) {
console.error('Error:', error);
}
}
fetchAllData();
Як зробити паралельні запити до API за допомогою Promises та async/await
Приклад паралельного виконання запитів до API за допомогою Promises.
Promise.all([fetchData(apiUrl1), fetchData(apiUrl2)])
.then(([data1, data2]) => {
console.log('Data1:', data1);
console.log('Data2:', data2);
})
.catch((error) => console.error('Error:', error));
Приклад паралельного виконання запитів до API за допомогою async/await та Promise.all
.
async function fetchAllDataParallel() {
try {
const [data1, data2] = await Promise.all([
fetchData(apiUrl1),
fetchData(apiUrl2),
]);
console.log('Data1:', data1);
console.log('Data2:', data2);
} catch (error) {
console.error('Error:', error);
}
}
fetchAllDataParallel();
Висновок
Асинхронне програмування на JavaScript з Promises, async/await та обробкою помилок дозволяє писати чистий, ефективний код для роботи з асинхронними операціями. Знання цих концепцій є важливим для успішної роботи з сучасними JavaScript-проектами.