Intro.js — это легковесная библиотека для создания пошаговых интерактивных руководств на веб-страницах. Она активно использует события для управления жизненным циклом шагов, что делает асинхронную обработку ключевым элементом при работе с пользовательскими интерфейсами.
Intro.js генерирует ряд событий, которые можно использовать для управления поведением приложения:
Все эти события поддерживают передачу функций обратного вызова, что позволяет интегрировать асинхронные операции.
onbeforechange и onafterchangeЧасто возникает необходимость загрузить данные с сервера или
выполнить долгую операцию перед отображением шага. В таких случаях
используется промис или async/await.
Пример асинхронной загрузки данных перед показом шага:
const intro = introJs();
intro.onbeforechange(async function(targetElement) {
if (targetElement.id === "step-2") {
const data = await fetchDataFromServer();
targetElement.innerHTML = `Данные загружены: ${data}`;
}
});
Здесь функция fetchDataFromServer() возвращает промис, и
Intro.js корректно ожидает завершения асинхронной операции перед
отображением следующего шага.
Использование async/await делает код более читаемым по
сравнению с цепочками .then().
intro.onafterchange(async function(targetElement) {
if (targetElement.id === "step-3") {
const animationResult = await runAnimation(targetElement);
console.log(animationResult);
}
});
Иногда необходимо выполнить асинхронные действия при завершении тура, например, сохранить прогресс пользователя на сервере:
intro.onbeforeexit(async function() {
try {
await saveUserProgress();
console.log("Прогресс сохранен");
} catch (error) {
console.error("Ошибка при сохранении прогресса", error);
}
});
Важно отметить, что Intro.js не блокирует интерфейс, поэтому любые операции должны быть корректно обработаны с помощью промисов.
intro.onafterchange(async function(targetElement) {
const ready = await checkStepReady(targetElement);
if (ready) {
intro.goToStep(4).start();
}
});
Intro.js часто используется совместно с динамическими интерфейсами, где шаги зависят от состояния DOM. Асинхронные функции позволяют:
Пример с динамическим контентом:
intro.onafterchange(async function(targetElement) {
if (targetElement.dataset.dynamic === "true") {
const content = await fetchDynamicContent(targetElement.dataset.id);
targetElement.innerHTML = content;
}
});
async/await вместо
.then() для повышения читаемости кода.onbeforechange
для подготовки данных, onafterchange для анимаций и
взаимодействия с пользователем, onbeforeexit для финальных
операций.Асинхронная обработка событий в Intro.js обеспечивает гибкость при создании интерактивных туров, позволяет интегрировать внешние API, динамический контент и сложные пользовательские сценарии без блокировки интерфейса.