Bir web sunucusuna veri gönderdiğinizde bazen istekler başarısız olur. Google bunun nedeni kullanıcının bağlantısını kesmesi veya sunucu çalışmıyor; her iki durumda da isteklerinizi sık sık göndermeyi daha sonra tekrar deneyin.
Yeni BackgroundSync API
bu sorun için ideal bir çözümdür. Bir hizmet çalışanı,
ağ isteği başarısız olduysa sync etkinliği almak için kaydolabilir,
Tarayıcı, bağlantının geri geldiğini düşündüğünde teslim edilir.
Senkronizasyon etkinliğinin, kullanıcı
geleneksel yöntemden çok daha etkili olmasını sağlayan
yeniden deneniyor.
Workbox Arka Plan Senkronizasyonu, arka plan senkronizasyonu gibi backgroundSync API'sini etkinleştirmenize ve kullanımını diğer Workbox modülleriyle entegre etmenize olanak tanır. Google Ayrıca, BackgroundSync.
backgroundSync API'sini destekleyen tarayıcılar başarısız olanları otomatik olarak tekrar oynatır sizin adınıza talep edebileceği tarayıcı tarafından yönetilen aralık, arasında eksponansiyel geri yükleme olduğunu görebilirsiniz. Şu tarayıcılarda BackgroundSync API'yi yerel olarak desteklemediğinden, Workbox Arka Plan Senkronizasyonu Service Worker her başlatıldığında otomatik olarak tekrar oynatmayı dener.
Temel Kullanım
Arka Plan Senkronizasyonu'nu kullanmanın en kolay yolu,Plugin
Başarısız istekleri otomatik olarak sıraya koyun ve sonraki sync tarihinde tekrar deneyin
tetiklendiği anlamına gelir.
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
fetchDidFail eklentisi geri çağırması ve
fetchDidFail yalnızca büyük olasılıkla
neden olabilir. Bu durumda, bir istek olması durumunda istekler yeniden
alınan yanıt
4xx veya 5xx hata durumu.
5xx durumuyla sonuçlanan tüm istekleri yeniden denemek isterseniz
bu işlemleri
fetchDidSucceed eklentisi ekleyerek
ekleyin:
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.
Gelişmiş Kullanım
Workbox Arka Plan Senkronizasyonu ayrıca bir Queue sınıfı da sağlar. Bunu
başarısız istekleri örneklendirmek ve eklemek için kullanılır. Başarısız istekler depolanır
IndexedDB dizininde
ve tarayıcı, bağlantının geri yüklendiğini algıladığında (ör.
.
Sıra Oluşturma
Workbox Arka Plan Senkronizasyon Sırası oluşturmak için, (benzersiz olmalıdır) kaynak):
import {Queue} from 'workbox-background-sync';
const queue = new Queue('myQueueName');
Sıra adı, girilen etiket adının bir parçası olarak
register() sürüm
tüm dünyadan
SyncManager. İnsanların
olarak da kullanılır
Nesne Deposu adı:
IndexedDB veritabanını kullanıyor.
Sıraya istek ekleme
Queue örneğinizi oluşturduktan sonra, başarısız istekleri bu örneğe ekleyebilirsiniz.
Başarısız isteği, .pushRequest() yöntemini çağırarak eklersiniz. Örneğin,
Aşağıdaki kod, başarısız olan istekleri yakalar ve sıraya ekler:
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());
});
Sıraya eklendikten sonra, istek otomatik olarak yeniden denenir.
hizmet çalışanı, sync etkinliğini alır (bu etkinlik, tarayıcı
bağlantının yeniden kurulduğunu düşünüyor). Şunu desteklemeyen tarayıcılar:
BackgroundSync API, hizmet çalışanı her çalıştığında sırayı yeniden dener.
yardımcı olabilir. Bu, hizmet çalışanını kontrol eden sayfanın
o yüzden o kadar etkili olmayacaktır.
Çalışma Kutusu Arka Plan Senkronizasyonunu Test Etme
Ne yazık ki, Arka Plan Sync'i test etmek biraz pratiksiz ve zor. çeşitli nedenlerle kullanır.
Uygulamanızı test etmek için en iyi yaklaşım aşağıdakileri yapmaktır:
- Bir sayfa yükleyin ve hizmet çalışanınızı kaydedin.
- Bilgisayarınızın ağını veya web sunucunuzu kapatın.
- CHROME DEVTOOLS'U ÇEVRİMDIŞI KULLANMAYIN. Çevrimdışı onay kutusu Geliştirici Araçları yalnızca sayfadaki istekleri etkiler. Hizmet çalışanı istekleri devam eder.
- Çalışma Kutusu Arka Plan Senkronizasyonu ile sıraya eklenmesi gereken ağ isteklerinde bulunun.
- İsteklerin sıraya alınıp alınmadığını incelemek için
Chrome DevTools > Application > IndexedDB > workbox-background-sync > requests.
- İsteklerin sıraya alınıp alınmadığını incelemek için
- Şimdi ağınızı veya web sunucunuzu etkinleştirin.
Şu adrese giderek erken
syncetkinliklerini zorunlu kılınChrome DevTools > Application > Service Workers,<your queue name>olması gereken yerdeworkbox-background-sync:<your queue name>sıra adını tıklayın ve daha sonra 'Senkronize Et'i tıklayarak düğmesini tıklayın.
Ağ isteklerinin başarısız isteklerle işlendiğini ve İstekler sonlandırıldığı için IndexedDB verileri artık boş başarıyla tekrar oynatıldı.
Türler
BackgroundSyncPlugin
fetchDidFail yaşam döngüsü geri çağırmasını uygulayan bir sınıf. Bu da,
başarısız istekleri arka plan senkronizasyon sırasına eklemek artık daha kolay.
Özellikler
-
oluşturucu
geçersiz
constructorişlevi aşağıdaki gibi görünür:(name: string, options?: QueueOptions) => {...}
-
ad
dize
workbox-background-sync.Queuesayfasını inceleyin. dokümanlarına göz atabilirsiniz. -
seçenekler
QueueOptions isteğe bağlı
-
returns
-
Queue
Başarısız isteklerin IndexedDB'de depolanmasını ve yeniden denenmesini sağlayan bir sınıf daha sonra. Depolama ve tekrar oynatma işleminin tüm bölümleri daha fazla bilgi edindiniz.
Özellikler
-
oluşturucu
geçersiz
Verilen seçeneklerle bir Queue örneği oluşturur
constructorişlevi aşağıdaki gibi görünür:(name: string, options?: QueueOptions) => {...}
-
ad
dize
Bu sıranın benzersiz adı. Bu ad şöyle olmalıdır: Senkronizasyon etkinliklerini ve mağaza isteklerini kaydetmek için kullanıldığı için benzersizdir. bu örneğe özel IndexedDB'dir. Şu durumda hata verilir: yinelenen bir ad algılandı.
-
seçenekler
QueueOptions isteğe bağlı
-
returns
-
-
ad
dize
-
getAll
geçersiz
maxRetentionTimebaşına, süresi dolmamış tüm girişleri döndürür. Süresi dolan tüm girişler sıradan kaldırılır.getAllişlevi aşağıdaki gibi görünür:() => {...}-
returns
Promise<QueueEntry[]>
-
-
popRequest
geçersiz
Sıradaki son isteği ( zaman damgası ve meta veriler) kullanabilirsiniz. Döndürülen nesne şu şekilde olur:
{request, timestamp, metadata}popRequestişlevi aşağıdaki gibi görünür:() => {...}-
returns
Promise<QueueEntry>
-
-
pushRequest
geçersiz
İletilen isteği IndexedDB'de depolar (zaman damgası ve meta verileri) ekleyin.
pushRequestişlevi aşağıdaki gibi görünür:(entry: QueueEntry) => {...}
-
giriş
QueueEntry
-
returns
Taahhüt<void>
-
-
registerSync
geçersiz
Bu örneğe özgü bir etiketle bir senkronizasyon etkinliği kaydeder.
registerSyncişlevi aşağıdaki gibi görünür:() => {...}-
returns
Taahhüt<void>
-
-
replayRequests
geçersiz
Sıradaki her isteği döngüye alır ve isteği yeniden getirmeye çalışır. Herhangi bir istek yeniden getirilemezse, söz konusu istek sıra (bir sonraki senkronizasyon etkinliği için yeniden deneme kaydeder).
replayRequestsişlevi aşağıdaki gibi görünür:() => {...}-
returns
Taahhüt<void>
-
-
shiftRequest
geçersiz
Sıradaki ilk isteği ( zaman damgası ve meta veriler) kullanabilirsiniz. Döndürülen nesne şu şekilde olur:
{request, timestamp, metadata}shiftRequestişlevi aşağıdaki gibi görünür:() => {...}-
returns
Promise<QueueEntry>
-
-
beden
geçersiz
Sırada bulunan girişlerin sayısını döndürür. Süresi dolan girişlerin de (
maxRetentionTimebaşına) bu sayıya dahil edildiğini unutmayın.sizeişlevi aşağıdaki gibi görünür:() => {...}-
returns
Promise<number>
-
-
unshiftRequest
geçersiz
İletilen isteği IndexedDB'de depolar (zaman damgası ve meta verileri) ekleyin.
unshiftRequestişlevi aşağıdaki gibi görünür:(entry: QueueEntry) => {...}
-
giriş
QueueEntry
-
returns
Taahhüt<void>
-
QueueOptions
Özellikler
-
forceSyncFallback
boole isteğe bağlı
-
maxRetentionTime
sayı isteğe bağlı
-
onSync
OnSyncCallback isteğe bağlı
QueueStore
IndexedDB'deki bir Sıradan gelen depolama isteklerini yöneten sınıf. daha kolay erişim için sıra adına göre dizine eklendi.
Çoğu geliştiricinin bu sınıfa doğrudan erişmesi gerekmez; ileri düzey kullanım alanları için gösterilir.
Özellikler
-
oluşturucu
geçersiz
Bu örneği bir Queue örneğiyle ilişkilendirir. Bu sayede, eklenen girişler sıra adlarıyla tanımlanır.
constructorişlevi aşağıdaki gibi görünür:(queueName: string) => {...}
-
queueName
dize
-
returns
-
-
deleteEntry
geçersiz
Belirli bir kimlikle ilgili girişi siler.
UYARI: Bu yöntem, silinen girişin sıra (
queueNameile eşleşir). Ancak bu sınırlama, çünkü bu sınıf herkese açık değil. Ek bir kontrol, bu yöntemin gerekenden daha yavaş olması gerekir.deleteEntryişlevi aşağıdaki gibi görünür:(id: number) => {...}
-
id
sayı
-
returns
Taahhüt<void>
-
-
getAll
geçersiz
Mağazada
queueNameile eşleşen tüm girişleri döndürür.getAllişlevi aşağıdaki gibi görünür:() => {...}-
returns
Promise<QueueStoreEntry[]>
-
-
popEntry
geçersiz
Sıradaki
queueNameile eşleşen son girişi kaldırır ve döndürür.popEntryişlevi aşağıdaki gibi görünür:() => {...}-
returns
Promise<QueueStoreEntry>
-
-
pushEntry
geçersiz
Kuyruğun en sonuna bir giriş ekleyin.
pushEntryişlevi aşağıdaki gibi görünür:(entry: UnidentifiedQueueStoreEntry) => {...}
-
giriş
UnidentifiedQueueStoreEntry
-
returns
Taahhüt<void>
-
-
shiftEntry
geçersiz
Sıradaki,
queueNameile eşleşen ilk girişi kaldırır ve döndürür.shiftEntryişlevi aşağıdaki gibi görünür:() => {...}-
returns
Promise<QueueStoreEntry>
-
-
beden
geçersiz
Mağazadaki
queueNameile eşleşen giriş sayısını döndürür.sizeişlevi aşağıdaki gibi görünür:() => {...}-
returns
Promise<number>
-
-
unshiftEntry
geçersiz
Sıradakinin başına bir giriş ekleyin.
unshiftEntryişlevi aşağıdaki gibi görünür:(entry: UnidentifiedQueueStoreEntry) => {...}
-
giriş
UnidentifiedQueueStoreEntry
-
returns
Taahhüt<void>
-
StorableRequest
İsteklerin seri durumdan çıkarılmasını ve seri durumdan çıkarılmasını kolaylaştıran bir sınıf IndexedDB'de depolanabilir.
Çoğu geliştiricinin bu sınıfa doğrudan erişmesi gerekmez; ileri düzey kullanım alanları için gösterilir.
Özellikler
-
oluşturucu
geçersiz
Oluşturmak için kullanılabilecek bir istek verisi nesnesini kabul eder
Requestile aynıdır ancak IndexedDB'de de depolanabilir.constructorişlevi aşağıdaki gibi görünür:(requestData: RequestData) => {...}
-
requestData
RequestData
Aşağıdakini içeren istek verisi nesnesi
urlve alakalı mülkler [requestInit]https://fetch.spec.whatwg.org/#requestinit.
-
returns
-
-
clone
geçersiz
Örneğin derin bir klonunu oluşturur ve döndürür.
cloneişlevi aşağıdaki gibi görünür:() => {...}-
returns
-
-
toObject
geçersiz
Örnek
_requestDatanesnesinin derin klonunu döndürür.toObjectişlevi aşağıdaki gibi görünür:() => {...}-
returns
RequestData
-
-
toRequest
geçersiz
Bu örneği bir İstek'e dönüştürür.
toRequestişlevi aşağıdaki gibi görünür:() => {...}-
returns
İstek
-
-
fromRequest
geçersiz
İstek nesnesini, yapılandırılabilen düz bir nesneye dönüştürür klonlanmış veya JSON ile dizelenmiş.
fromRequestişlevi aşağıdaki gibi görünür:(request: Request) => {...}
-
istek
İstek
-
returns
Promise<StorableRequest>
-