BackgroundSyncQueue — это один из ключевых инструментов библиотеки Workbox, предназначенный для обеспечения надежной доставки запросов, когда клиент временно находится в оффлайне. Класс реализует очередь запросов, которые будут автоматически повторно отправлены, когда устройство восстановит соединение с сетью.
Создание очереди происходит через конструктор
BackgroundSyncQueue. Основной синтаксис:
import { BackgroundSyncQueue } from 'workbox-background-sync';
const myQueue = new BackgroundSyncQueue('myQueueName', {
maxRetentionTime: 24 * 60, // Время хранения запросов в минутах
onSync: async ({ queue }) => {
let entry;
while ((entry = await queue.shiftRequest())) {
try {
await fetch(entry.request);
} catch (error) {
await queue.unshiftRequest(entry);
throw error;
}
}
}
});
Параметры конструктора:
queueName — уникальное имя очереди. Оно используется
для идентификации сохраненных запросов в IndexedDB.options.maxRetentionTime — время жизни запроса в
очереди в минутах. После истечения этого времени запрос удаляется
автоматически.options.onSync — асинхронная функция, вызываемая при
срабатывании синхронизации. В ней происходит обработка всех сохраненных
запросов.Запросы можно помещать в очередь напрямую через метод
pushRequest:
const request = new Request('/api/data', {
method: 'POST',
body: JSON.stringify({ key: 'value' }),
headers: { 'Content-Type': 'application/json' }
});
await myQueue.pushRequest({ request });
Ключевые моменты при работе с pushRequest:
Request.Workbox позволяет автоматизировать повторную отправку запросов через
событие sync сервис-воркера:
self.addEventListener('sync', (event) => {
if (event.tag === 'myQueueName') {
event.waitUntil(myQueue.replayRequests());
}
});
event.tag должен совпадать с именем очереди, переданным
при создании.replayRequests() последовательно отправляет все
запросы из очереди.Очередь можно связать с конкретными маршрутами через
registerRoute из Workbox Routing. Например, для всех
POST-запросов на /api/data:
import { registerRoute } from 'workbox-routing';
import { NetworkOnly } from 'workbox-strategies';
registerRoute(
({ url, request }) => url.pathname.startsWith('/api/data') && request.method === 'POST',
new NetworkOnly({
plugins: [myQueue]
}),
'POST'
);
NetworkOnly, чтобы запросы
сначала пытались отправиться в сеть.BackgroundSyncQueue предоставляет несколько методов для работы с очередью:
replayRequests() — вручную инициирует повторную
отправку всех запросов.pushRequest({ request }) — добавляет новый запрос.shiftRequest() — извлекает первый запрос из очереди для
обработки.unshiftRequest(entry) — возвращает неудачный запрос
обратно в очередь.getAll() — возвращает массив всех текущих запросов в
очереди.deleteQueue() — очищает все запросы из очереди.FormData.onSync для повторной
постановки запроса в очередь.maxRetentionTime, исходя из предполагаемого
времени нахождения пользователя оффлайн.BackgroundSyncQueue обеспечивает надежную доставку данных при нестабильном соединении и является мощным инструментом для Progressive Web Apps, где важна гарантированная синхронизация с сервером.