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
sync
etkinliklerini 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
constructor
işlevi aşağıdaki gibi görünür:(name: string, options?: QueueOptions) => {...}
-
ad
dize
workbox-background-sync.Queue
sayfası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
constructor
iş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
maxRetentionTime
başı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.getAll
iş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}
popRequest
iş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.
pushRequest
iş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.
registerSync
iş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).
replayRequests
iş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}
shiftRequest
iş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 (
maxRetentionTime
başına) bu sayıya dahil edildiğini unutmayın.size
iş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.
unshiftRequest
iş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.
constructor
iş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 (
queueName
ile 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.deleteEntry
işlevi aşağıdaki gibi görünür:(id: number) => {...}
-
id
sayı
-
returns
Taahhüt<void>
-
-
getAll
geçersiz
Mağazada
queueName
ile eşleşen tüm girişleri döndürür.getAll
işlevi aşağıdaki gibi görünür:() => {...}
-
returns
Promise<QueueStoreEntry[]>
-
-
popEntry
geçersiz
Sıradaki
queueName
ile eşleşen son girişi kaldırır ve döndürür.popEntry
işlevi aşağıdaki gibi görünür:() => {...}
-
returns
Promise<QueueStoreEntry>
-
-
pushEntry
geçersiz
Kuyruğun en sonuna bir giriş ekleyin.
pushEntry
işlevi aşağıdaki gibi görünür:(entry: UnidentifiedQueueStoreEntry) => {...}
-
giriş
UnidentifiedQueueStoreEntry
-
returns
Taahhüt<void>
-
-
shiftEntry
geçersiz
Sıradaki,
queueName
ile eşleşen ilk girişi kaldırır ve döndürür.shiftEntry
işlevi aşağıdaki gibi görünür:() => {...}
-
returns
Promise<QueueStoreEntry>
-
-
beden
geçersiz
Mağazadaki
queueName
ile eşleşen giriş sayısını döndürür.size
işlevi aşağıdaki gibi görünür:() => {...}
-
returns
Promise<number>
-
-
unshiftEntry
geçersiz
Sıradakinin başına bir giriş ekleyin.
unshiftEntry
iş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
Request
ile aynıdır ancak IndexedDB'de de depolanabilir.constructor
işlevi aşağıdaki gibi görünür:(requestData: RequestData) => {...}
-
requestData
RequestData
Aşağıdakini içeren istek verisi nesnesi
url
ve 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.
clone
işlevi aşağıdaki gibi görünür:() => {...}
-
returns
-
-
toObject
geçersiz
Örnek
_requestData
nesnesinin derin klonunu döndürür.toObject
iş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.
toRequest
iş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ş.
fromRequest
işlevi aşağıdaki gibi görünür:(request: Request) => {...}
-
istek
İstek
-
returns
Promise<StorableRequest>
-