Cuando envías datos a un servidor web, a veces las solicitudes fallarán. Integra puede deberse a que el usuario perdió la conectividad el servidor está inactivo; en cualquier caso, con frecuencia, intentas enviar las solicitudes de nuevo más tarde.
La nueva API de BackgroundSync
es una solución ideal a este problema. Cuando un service worker detecta que hay
falló la solicitud de red, se puede registrar para recibir un evento sync
,
que se entrega cuando el navegador considera que se recuperó la conectividad.
Ten en cuenta que el evento de sincronización puede publicarse incluso si el usuario salió del
, lo que lo hace mucho más eficaz que el método tradicional de
reintentar las solicitudes fallidas.
La sincronización en segundo plano de la caja de trabajo está diseñada para facilitar el uso de la BackgroundSync y, luego, integrar su uso con otros módulos de Workbox. Integra también implementa una estrategia de resguardo para los navegadores Sincronización en segundo plano.
Los navegadores compatibles con la API de BackgroundSync no podrán volver a reproducir el contenido de forma automática. solicitudes en tu nombre en una intervalo administrado por el navegador, probablemente con una retirada exponencial entre los intentos de repetición. En los navegadores que no es compatible de forma nativa con la API de BackgroundSync, la sincronización en segundo plano de Workbox automáticamente una repetición cada vez que se inicia tu service worker.
Uso básico
La forma más fácil de usar la sincronización en segundo plano es usar la Plugin
que
poner en cola automáticamente las solicitudes fallidas y volver a intentarlo cuando sync
se activan los eventos correspondientes.
import {BackgroundSyncPlugin} from 'workbox-background-sync';
import {registerRoute} from 'workbox-routing';
import {NetworkOnly} from 'workbox-strategies';
const bgSyncPlugin = new BackgroundSyncPlugin('myQueueName', {
maxRetentionTime: 24 * 60, // Retry for max of 24 Hours (specified in minutes)
});
registerRoute(
/\/api\/.*\/*.json/,
new NetworkOnly({
plugins: [bgSyncPlugin],
}),
'POST'
);
BackgroundSyncPlugin
hooks en
devolución de llamada del complemento fetchDidFail
fetchDidFail
solo se invoca si se arroja una excepción, probablemente debido a
a una falla de red. Esto significa que las solicitudes no se reintentarán si hay
respuesta recibida con un
Estado de error 4xx
o 5xx
.
Si deseas reintentar todas las solicitudes que generen, p.ej., un estado 5xx
,
puedes hacerlo
agregar un complemento fetchDidSucceed
a tu estrategia:
const statusPlugin = {
fetchDidSucceed: ({response}) => {
if (response.status >= 500) {
// Throwing anything here will trigger fetchDidFail.
throw new Error('Server error.');
}
// If it's not 5xx, use the response as-is.
return response;
},
};
// Add statusPlugin to the plugins array in your strategy.
Uso avanzado
La sincronización en segundo plano de la caja de trabajo también proporciona una clase Queue
, que puedes
crear instancias y agregarles solicitudes erróneas. Las solicitudes fallidas se almacenan
en IndexedDB.
y se vuelve a intentar cuando el navegador considera que se restableció la conectividad (es decir,
cuando recibe el evento de sincronización).
Cómo crear una cola
Para crear una cola de sincronización en segundo plano de Workbox, debes crearla con un nombre de cola (que debe ser único para tu origen):
import {Queue} from 'workbox-background-sync';
const queue = new Queue('myQueueName');
El nombre de la cola se usa como parte del nombre de la etiqueta que se
register()
por el
SyncManager
Es
también se usa como el
Object Store para
la base de datos IndexedDB.
Agrega una solicitud a la cola
Una vez creada tu instancia de cola, puedes agregarle solicitudes con errores.
Puedes invocar el método .pushRequest()
para agregar solicitudes con errores. Por ejemplo:
el siguiente código detecta todas las solicitudes que fallan y las agrega a la cola:
import {Queue} from 'workbox-background-sync';
const queue = new Queue('myQueueName');
self.addEventListener('fetch', event => {
// Add in your own criteria here to return early if this
// isn't a request that should use background sync.
if (event.request.method !== 'POST') {
return;
}
const bgSyncLogic = async () => {
try {
const response = await fetch(event.request.clone());
return response;
} catch (error) {
await queue.pushRequest({request: event.request});
return error;
}
};
event.respondWith(bgSyncLogic());
});
Una vez agregada a la cola, la solicitud se reintenta automáticamente cuando
service worker recibe el evento sync
(que ocurre cuando el navegador
considera que se restablece la conectividad). Los navegadores que no admiten la
La API de BackgroundSync volverá a intentar la cola cada vez que se active
iniciar. Esto requiere que la página que controla el service worker
en ejecución, por lo que no será tan eficaz.
Prueba la sincronización en segundo plano de la caja de trabajo
Lamentablemente, probar BackgroundSync es algo poco intuitivo y difícil por varias razones.
El mejor enfoque para probar tu implementación es el siguiente:
- Carga una página y registra tu service worker.
- Desactiva la red de la computadora o el servidor web.
- NO UTILICE LAS HERRAMIENTAS PARA PROGRAMADORES CHROME SIN CONEXIÓN. La casilla de verificación Sin conexión en Las Herramientas para desarrolladores solo afectan las solicitudes de la página. Solicitudes de service worker seguirán funcionando.
- Realiza solicitudes de red que deben estar en cola con la sincronización en segundo plano de la caja de trabajo.
- Para verificar si las solicitudes se agregaron a la cola, consulta
Chrome DevTools > Application > IndexedDB > workbox-background-sync > requests
- Para verificar si las solicitudes se agregaron a la cola, consulta
- Ahora, activa tu red o servidor web.
Para forzar un evento anticipado de
sync
, accede aChrome DevTools > Application > Service Workers
, ingresando el nombre de la etiqueta deworkbox-background-sync:<your queue name>
, donde debe estar<your queue name>
nombre de la cola que estableciste y, a continuación, haz clic en el botón .Deberías ver que las solicitudes de red se procesan para las solicitudes con errores y los datos de IndexedDB deberían estar vacíos, ya que las solicitudes se se volvió a reproducir correctamente.
Tipos
BackgroundSyncPlugin
Una clase que implementa la devolución de llamada del ciclo de vida de fetchDidFail
. Esto hace que
es más fácil agregar solicitudes erróneas a una cola de sincronización en segundo plano.
Propiedades
-
constructor
void
La función
constructor
se ve de la siguiente manera:(name: string, options?: QueueOptions) => {...}
-
nombre
string
Consulta la
workbox-background-sync.Queue
para conocer los detalles de los parámetros. -
opciones
QueueOptions opcional
-
muestra
-
Queue
Una clase para administrar el almacenamiento de solicitudes fallidas en IndexedDB y reintentarlas más adelante. Todas las partes del proceso de almacenamiento y repetición son observables a través de devoluciones de llamada.
Propiedades
-
constructor
void
Crea una instancia de una cola con las opciones determinadas.
La función
constructor
se ve de la siguiente manera:(name: string, options?: QueueOptions) => {...}
-
nombre
string
El nombre único de esta cola. Este nombre debe tener único, ya que se usa para registrar eventos de sincronización y almacenar solicitudes en IndexedDB específica para esta instancia. Se mostrará un error si si se detecta un nombre duplicado.
-
opciones
QueueOptions opcional
-
muestra
-
-
nombre
string
-
getAll
void
Muestra todas las entradas que no vencieron (según
maxRetentionTime
). Se quitan de la cola las entradas vencidas.La función
getAll
se ve de la siguiente manera:() => {...}
-
muestra
Promise<QueueEntry[]>
-
-
popRequest
void
Quita y muestra la última solicitud de la cola (junto con su la marca de tiempo y los metadatos). El objeto que se muestra toma la siguiente forma:
{request, timestamp, metadata}
La función
popRequest
se ve de la siguiente manera:() => {...}
-
muestra
Promise<QueueEntry>
-
-
pushRequest
void
Almacena la solicitud pasada en IndexedDB (con su marca de tiempo y cualquier metadatos) al final de la cola.
La función
pushRequest
se ve de la siguiente manera:(entry: QueueEntry) => {...}
-
entry.
QueueEntry
-
muestra
Promesa<void>
-
-
registerSync
void
Registra un evento de sincronización con una etiqueta única para esta instancia.
La función
registerSync
se ve de la siguiente manera:() => {...}
-
muestra
Promesa<void>
-
-
replayRequests
void
Repite cada solicitud en la cola y trata de recuperarla. Si cualquier solicitud no se puede volver a recuperar, se vuelve a colocar en la misma posición la cola (lo que registra un reintento para el siguiente evento de sincronización).
La función
replayRequests
se ve de la siguiente manera:() => {...}
-
muestra
Promesa<void>
-
-
shiftRequest
void
Quita y muestra la primera solicitud de la cola (junto con su la marca de tiempo y los metadatos). El objeto que se muestra toma la siguiente forma:
{request, timestamp, metadata}
La función
shiftRequest
se ve de la siguiente manera:() => {...}
-
muestra
Promise<QueueEntry>
-
-
tamaño
void
Muestra la cantidad de entradas presentes en la cola. Ten en cuenta que las entradas vencidas (por
maxRetentionTime
) también se incluyen en este recuento.La función
size
se ve de la siguiente manera:() => {...}
-
muestra
Promise<number>
-
-
unshiftRequest
void
Almacena la solicitud pasada en IndexedDB (con su marca de tiempo y cualquier metadatos) al principio de la cola.
La función
unshiftRequest
se ve de la siguiente manera:(entry: QueueEntry) => {...}
-
entry.
QueueEntry
-
muestra
Promesa<void>
-
QueueOptions
Propiedades
-
forceSyncFallback
booleano opcional
-
maxRetentionTime
número opcional
-
onSync
OnSyncCallback opcional
QueueStore
Una clase para administrar las solicitudes de almacenamiento de una cola en IndexedDB. por su nombre de cola para un acceso más fácil.
La mayoría de los desarrolladores no necesitarán acceder a esta clase directamente. se expone para casos de uso avanzados.
Propiedades
-
constructor
void
Asocia esta instancia con una instancia de cola, de modo que las entradas agregadas se pueden identificados por su nombre de cola.
La función
constructor
se ve de la siguiente manera:(queueName: string) => {...}
-
queueName
string
-
muestra
-
-
deleteEntry
void
Borra la entrada del ID determinado.
ADVERTENCIA: Este método no garantiza que la entrada eliminada pertenezca a esta (es decir, coincide con
queueName
). Pero esta limitación es aceptable ya que esta clase no está expuesta públicamente. Una comprobación adicional haría que este método sea más lento de lo necesario.La función
deleteEntry
se ve de la siguiente manera:(id: number) => {...}
-
id
número
-
muestra
Promesa<void>
-
-
getAll
void
Muestra todas las entradas de la tienda que coincidan con
queueName
.La función
getAll
se ve de la siguiente manera:() => {...}
-
muestra
Promise<QueueStoreEntry[]>
-
-
popEntry
void
Quita y muestra la última entrada de la cola que coincide con el
queueName
.La función
popEntry
se ve de la siguiente manera:() => {...}
-
muestra
Promise<QueueStoreEntry>
-
-
pushEntry
void
Agrega una entrada en el último lugar de la cola.
La función
pushEntry
se ve de la siguiente manera:(entry: UnidentifiedQueueStoreEntry) => {...}
-
entry.
UnidentifiedQueueStoreEntry
-
muestra
Promesa<void>
-
-
shiftEntry
void
Quita y muestra la primera entrada de la cola que coincide con el
queueName
.La función
shiftEntry
se ve de la siguiente manera:() => {...}
-
muestra
Promise<QueueStoreEntry>
-
-
tamaño
void
Muestra la cantidad de entradas en la tienda que coinciden con
queueName
.La función
size
se ve de la siguiente manera:() => {...}
-
muestra
Promise<number>
-
-
unshiftEntry
void
Antepón una entrada primero en la cola.
La función
unshiftEntry
se ve de la siguiente manera:(entry: UnidentifiedQueueStoreEntry) => {...}
-
entry.
UnidentifiedQueueStoreEntry
-
muestra
Promesa<void>
-
StorableRequest
Una clase para facilitar la serialización y deserialización de solicitudes para que puede almacenarse en IndexedDB.
La mayoría de los desarrolladores no necesitarán acceder a esta clase directamente. se expone para casos de uso avanzados.
Propiedades
-
constructor
void
Acepta un objeto de datos de solicitud que se puede usar para construir un
Request
, pero también se puede almacenar en IndexedDB.La función
constructor
se ve de la siguiente manera:(requestData: RequestData) => {...}
-
requestData
RequestData
Un objeto de datos de solicitud que incluye la
url
y las propiedades relevantes de [requestInit]https://fetch.spec.whatwg.org/#requestinit
-
muestra
-
-
clone
void
Crea y muestra una clonación profunda de la instancia.
La función
clone
se ve de la siguiente manera:() => {...}
-
muestra
-
-
toObject
void
Muestra una clonación directa del objeto
_requestData
de las instancias.La función
toObject
se ve de la siguiente manera:() => {...}
-
muestra
RequestData
-
-
toRequest
void
Convierte esta instancia en una solicitud.
La función
toRequest
se ve de la siguiente manera:() => {...}
-
muestra
Solicitud
-
-
fromRequest
void
Convierte un objeto Request en un objeto sin formato que se puede estructurar. se clona o se convierte en cadenas JSON.
La función
fromRequest
se ve de la siguiente manera:(request: Request) => {...}
-
request
Solicitud
-
muestra
Promise<StorableRequest>
-