При работе с асинхронными операциями в JavaScript часто используются callback-функции для обработки результатов. Ошибки в этих функциях могут возникать на разных уровнях: внутри асинхронного кода, при сетевых запросах или при обработке данных. Правильная обработка ошибок критически важна для поддержания стабильности приложения и информирования пользователя о проблемах. Библиотека Toastify позволяет визуально уведомлять пользователя об ошибках через всплывающие уведомления (toasts).
Для начала необходимо подключить библиотеку. Toastify может быть установлена через npm:
npm install toastify-js
или подключена напрямую через CDN:
Создание простого уведомления:
Toastify({
text: "Пример уведомления",
duration: 3000, // продолжительность в миллисекундах
gravity: "top", // позиция сверху или снизу
position: "right", // позиция справа или слева
backgroundColor: "linear-gradient(to right, #ff5f6d, #ffc371)"
}).showToast();
При работе с callback важно различать ошибки синхронного и асинхронного характера. На практике это выглядит так:
function fetchData(callback) {
setTimeout(() => {
const success = Math.random() > 0.5; // имитация ошибки
if (success) {
callback(null, { data: "Данные успешно получены" });
} else {
callback(new Error("Не удалось загрузить данные"), null);
}
}, 1000);
}
Здесь первый аргумент callback зарезервирован для ошибок
(err), второй — для успешного результата
(result). Такой подход позволяет стандартизировать
обработку ошибок.
Если callback возвращает ошибку, её можно мгновенно показать пользователю через toast:
fetchData((err, result) => {
if (err) {
Toastify({
text: `Ошибка: ${err.message}`,
duration: 5000,
gravity: "top",
position: "right",
backgroundColor: "linear-gradient(to right, #ff5f6d, #ff0000)"
}).showToast();
return;
}
Toastify({
text: `Успех: ${result.data}`,
duration: 3000,
gravity: "top",
position: "right",
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)"
}).showToast();
});
Здесь видно ключевой паттерн: ошибка обрабатывается отдельно и визуализируется с помощью красного уведомления, а успешный результат — зелёным.
Toastify поддерживает широкие возможности кастомизации, что позволяет различать ошибки и успехи визуально:
stopOnFocus: true позволяет уведомлению не исчезать при
наведении мыши.Пример настройки критической ошибки:
Toastify({
text: "Серьёзная ошибка соединения",
duration: 8000,
gravity: "top",
position: "center",
backgroundColor: "#d9534f",
stopOnFocus: true
}).showToast();
В больших приложениях часто возникают цепочки асинхронных операций с разными callback. Для централизованной обработки ошибок можно создать обёртку для callback, которая автоматически вызывает toast при ошибке:
function handleErrorCallback(callback) {
return function(err, data) {
if (err) {
Toastify({
text: `Ошибка: ${err.message}`,
duration: 5000,
gravity: "top",
position: "right",
backgroundColor: "#ff6b6b"
}).showToast();
} else {
callback(data);
}
};
}
// Использование
fetchData(handleErrorCallback((data) => {
console.log("Данные обработаны:", data);
}));
Такой подход уменьшает дублирование кода и обеспечивает единый стиль уведомлений об ошибках.
Иногда важно не только показать ошибку пользователю, но и сохранить её в логе для анализа:
function logAndNotify(err) {
console.error(err);
Toastify({
text: `Ошибка: ${err.message}`,
duration: 5000,
gravity: "top",
position: "right",
backgroundColor: "#ff4d4d"
}).showToast();
}
fetchData((err, data) => {
if (err) return logAndNotify(err);
console.log("Данные:", data);
});
Такой подход сочетает информирование пользователя и поддержку разработчика для диагностики проблем.
Для больших проектов удобно создавать событийный центр уведомлений, который реагирует на ошибки callback по всему приложению:
document.addEventListener("app:error", (e) => {
Toastify({
text: `Ошибка: ${e.detail.message}`,
duration: 5000,
gravity: "top",
position: "right",
backgroundColor: "#e74c3c"
}).showToast();
});
// В callback
fetchData((err, data) => {
if (err) {
const event = new CustomEvent("app:error", { detail: { message: err.message } });
document.dispatchEvent(event);
return;
}
console.log("Данные:", data);
});
Такой паттерн позволяет отделить визуальную часть уведомлений от логики ошибок, облегчая поддержку и масштабирование приложения.