वेब सर्वर पर डेटा भेजते समय, कभी-कभी अनुरोध पूरे नहीं हो पाते हैं. यह उपयोगकर्ता की कनेक्टिविटी टूट जाने के कारण या ऐसा इसलिए हो सकता है क्योंकि सर्वर काम नहीं कर रहा है; हो सकता है कि किसी मामले में आप अनुरोध भेजने का प्रयास करना चाहें फिर से कोशिश करें.
नया backgroundSync API
इस समस्या का आदर्श समाधान है. जब सर्विस वर्कर को पता चलता है कि
नेटवर्क अनुरोध पूरा नहीं हो सका, यह sync
इवेंट पाने के लिए रजिस्टर कर सकता है,
जो तब डिलीवर होता है जब ब्राउज़र को लगता है कि कनेक्टिविटी वापस आ गई है.
ध्यान दें कि सिंक इवेंट को डिलीवर किया जा सकता है, भले ही उपयोगकर्ता ने
आवेदन, जो इसे आम तौर पर चले जाने वाले
पूरे न हो पाने वाले अनुरोधों की फिर से कोशिश की जा रही है.
Workbox के बैकग्राउंड सिंक को इस तरह डिज़ाइन किया गया है कि बैकग्राउंड सिंक एपीआई को डाउनलोड करें और इसके इस्तेमाल को अन्य Workbox मॉड्यूल के साथ इंटिग्रेट करें. यह यह उन ब्राउज़र के लिए एक फ़ॉलबैक स्ट्रेटजी भी लागू करता है जो अभी तक लागू नहीं हुए हैं बैकग्राउंड सिंक.
बैकग्राउंड सिंक एपीआई के साथ काम करने वाले ब्राउज़र अपने-आप फिर से चले जाएंगे आपकी ओर से किसी लिंक पर जाकर अनुरोध करता है इंटरवल को ब्राउज़र से मैनेज किया जाता है, ऐसा हो सकता है कि फिर से चलाने की कोशिशों के बीच एक्स्पोनेंशियल बैकऑफ़ इस्तेमाल हो. ऐसे ब्राउज़र जिनमें बैकग्राउंड सिंक एपीआई के साथ काम नहीं करता है, तो Workbox बैकग्राउंड सिंक की मदद से आपका सर्विस वर्कर चालू होने पर, अपने-आप फिर से चलाने की कोशिश करता है.
बुनियादी इस्तेमाल
बैकग्राउंड में वीडियो सिंक करने की सुविधा का इस्तेमाल करने के लिए, Plugin
का इस्तेमाल करें. इससे
पूरे न हो पाने वाले अनुरोधों की सूची अपने-आप बुक हो जाए और sync
के बाद फिर से कोशिश करें
इवेंट ट्रिगर होते हैं.
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
प्लगिन कॉलबैक, और
fetchDidFail
का इस्तेमाल सिर्फ़ तब किया जाता है, जब कोई अपवाद मौजूद हो. इसकी सबसे ज़्यादा संभावना होती है
नेटवर्क में गड़बड़ी हुई है. इसका मतलब है कि अगर
के साथ जवाब मिला
4xx
या 5xx
गड़बड़ी की स्थिति.
अगर आपको मिलने वाले सभी अनुरोधों को फिर से करना है, जैसे कि 5xx
स्थिति,
ऐसा करके यह पता लगाया जा सकता है कि
fetchDidSucceed
प्लगिन जोड़ना
रणनीति को ध्यान में रखकर भी ऐसा किया जा सकता है:
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.
बेहतर इस्तेमाल के लिए
Workbox के बैकग्राउंड सिंक में एक Queue
क्लास भी मिलती है. इसकी मदद से ये काम किए जा सकते हैं
विफल अनुरोधों को इंस्टैंशिएट करें और जोड़ें. पूरे न हो पाने वाले अनुरोधों को सेव कर लिया गया है
IndexedDB में
और जब ब्राउज़र को लगता है कि कनेक्टिविटी पुनर्स्थापित हो गई है, तो पुनः प्रयास किया जाता है (यानी
सिंक इवेंट मिलने पर).
कोई सूची बनाना
Workbox की बैकग्राउंड सिंक वाली सूची बनाने के लिए, आपको इसका इस्तेमाल करना होगा सूची का नाम (जो आपके चैनल के लिए यूनीक होना चाहिए शुरुआत की जगह):
import {Queue} from 'workbox-background-sync';
const queue = new Queue('myQueueName');
सूची का नाम, उन टैग के नाम के हिस्से के रूप में इस्तेमाल किया जाता है जिन्हें
register()
से जुड़ा
दुनिया भर के
SyncManager
. यह समय है
इसका इस्तेमाल इस तरह से भी किया जाता है:
इसके लिए Object Store नाम
IndexedDB डेटाबेस.
सूची में अनुरोध जोड़ना
सूची बनाने के बाद, उसमें पूरे न हो पाने वाले अनुरोध जोड़े जा सकते हैं.
आपने .pushRequest()
तरीके का इस्तेमाल करके, पूरा अनुरोध नहीं जोड़ा है. उदाहरण के लिए,
यह कोड, पूरे न हो पाने वाले सभी अनुरोधों को कैच करके उन्हें सूची में जोड़ देता है:
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());
});
सूची में जुड़ने के बाद, अनुरोध अपने-आप फिर से कोशिश करता है. ऐसा तब होता है, जब
सर्विस वर्कर को sync
इवेंट मिलता है (जो तब होता है जब ब्राउज़र
को लगता है कि कनेक्टिविटी बहाल हो गई है). वे ब्राउज़र जो
बैकग्राउंड सिंक एपीआई हर बार सर्विस वर्कर के होने पर, सूची में फिर से शामिल होने की कोशिश करेगा
शुरू हुआ. इसके लिए यह ज़रूरी है कि सर्विस वर्कर को कंट्रोल करने वाला पेज
तो यह उतना प्रभावी नहीं होगा.
वर्कबॉक्स बैकग्राउंड सिंक की जांच की जा रही है
अफ़सोस की बात है, BackdropSync की जांच करना कुछ हद तक आसान और मुश्किल है कई वजहों से ऐसा किया जा सकता है.
लागू होने की जांच करने का सबसे सही तरीका, यहां दिया गया तरीका है:
- पेज लोड करें और अपने सर्विस वर्कर को रजिस्टर करें.
- अपने कंप्यूटर का नेटवर्क या वेब सर्वर बंद कर दें.
- Chrome DevTools का ऑफ़लाइन इस्तेमाल न करें. ऑफ़लाइन चेकबॉक्स DevTools सिर्फ़ पेज के अनुरोधों पर असर डालता है. सर्विस वर्कर के लिए अनुरोध पहले की तरह ही काम करता रहेगा.
- ऐसे नेटवर्क अनुरोध करें जिन्हें वर्कबॉक्स बैकग्राउंड सिंक के साथ सूची में रखा जाना चाहिए.
- आप
Chrome DevTools > Application > IndexedDB > workbox-background-sync > requests
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
- आप
- अब अपना नेटवर्क या वेब सर्वर चालू करें.
इस पर जाकर,
sync
इवेंट से पहले इसे ज़बरदस्ती चालू करेंChrome DevTools > Application > Service Workers
, इसका टैग नाम डालकरworkbox-background-sync:<your queue name>
जहां<your queue name>
होना चाहिए सूची का नाम डालें, और फिर 'सिंक करें' पर क्लिक करें बटन.आपको पूरे न हो पाने वाले अनुरोधों के लिए पूरे नेटवर्क अनुरोध दिखेंगे और IndexedDB डेटा अब खाली होना चाहिए, क्योंकि अनुरोध किए गए फिर से चलाया गया.
टाइप
BackgroundSyncPlugin
fetchDidFail
लाइफ़साइकल कॉलबैक लागू करने वाली क्लास. इससे यह
बैकग्राउंड में सिंक करने की सूची में, पूरे न हो पाने वाले अनुरोधों को जोड़ना आसान है.
प्रॉपर्टी
-
कंस्ट्रक्टर
अमान्य
constructor
फ़ंक्शन इस तरह दिखता है:(name: string, options?: QueueOptions) => {...}
-
नाम
स्ट्रिंग
workbox-background-sync.Queue
देखें पैरामीटर की जानकारी के लिए दस्तावेज़. -
विकल्प
QueueOptions ज़रूरी नहीं
-
returns
-
Queue
IndexedDB में पूरे न हो पाने वाले अनुरोधों को मैनेज करने और फिर से कोशिश करने वाली क्लास बाद में. स्टोर करने और फिर से चलाने की प्रोसेस के सभी हिस्सों की निगरानी कॉलबैक.
प्रॉपर्टी
-
कंस्ट्रक्टर
अमान्य
दिए गए विकल्पों के साथ सूची का इंस्टेंस बनाता है
constructor
फ़ंक्शन इस तरह दिखता है:(name: string, options?: QueueOptions) => {...}
-
नाम
स्ट्रिंग
इस सूची के लिए खास नाम. यह नाम यूनीक है, क्योंकि इसका इस्तेमाल सिंक इवेंट और स्टोर के अनुरोध रजिस्टर करने में किया जाता है इस इंस्टेंस के लिए खास तौर पर IndexedDB में. गड़बड़ी होती है अगर डुप्लीकेट नाम का पता चला है.
-
विकल्प
QueueOptions ज़रूरी नहीं
-
returns
-
-
नाम
स्ट्रिंग
-
getAll
अमान्य
वे सभी एंट्री दिखाता है जिनकी समयसीमा खत्म नहीं हुई है (हर
maxRetentionTime
के हिसाब से). जिन एंट्री की समयसीमा खत्म हो चुकी है उन्हें सूची से हटा दिया जाता है.getAll
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
Promise<QueueEntry[]>
-
-
popRequest
अमान्य
सूची में मौजूद आखिरी अनुरोध को हटाता है और वापस भेजता है. साथ ही, टाइमस्टैंप और कोई भी मेटाडेटा). लौटाया गया ऑब्जेक्ट इस तरह से होता है:
{request, timestamp, metadata}
.popRequest
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
Promise<QueueEntry>
-
-
pushRequest
अमान्य
पास किए गए अनुरोध को IndexedDB में संग्रहित करता है (उसके टाइमस्टैंप और किसी भी मेटाडेटा) पर क्लिक करें.
pushRequest
फ़ंक्शन इस तरह दिखता है:(entry: QueueEntry) => {...}
-
एंट्री
QueueEntry
-
returns
प्रॉमिस<void>
-
-
registerSync
अमान्य
इस इंस्टेंस के लिए यूनीक टैग के साथ, सिंक इवेंट को रजिस्टर करता है.
registerSync
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
प्रॉमिस<void>
-
-
replayRequests
अमान्य
सूची में मौजूद हर अनुरोध को लूप में भेजता है और उसे फिर से फ़ेच करने की कोशिश करता है. अगर कोई अनुरोध फिर से फ़ेच नहीं हो पाता है, तो उसे उसी जगह पर वापस डाल दिया जाता है सूची (जो अगले सिंक इवेंट के लिए फिर से कोशिश करती है).
replayRequests
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
प्रॉमिस<void>
-
-
shiftRequest
अमान्य
सूची में मौजूद पहले अनुरोध को हटाता है और दिखाता है (इसके साथ टाइमस्टैंप और कोई भी मेटाडेटा). लौटाया गया ऑब्जेक्ट इस तरह से होता है:
{request, timestamp, metadata}
.shiftRequest
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
Promise<QueueEntry>
-
-
साइज़
अमान्य
सूची में मौजूद एंट्री की संख्या दिखाता है. ध्यान दें कि इस संख्या में ऐसी एंट्री भी शामिल होती हैं जिनकी समयसीमा खत्म हो चुकी है (हर
maxRetentionTime
).size
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
Promise<number>
-
-
unshiftRequest
अमान्य
पास किए गए अनुरोध को IndexedDB में संग्रहित करता है (उसके टाइमस्टैंप और किसी भी मेटाडेटा) जोड़ दें.
unshiftRequest
फ़ंक्शन इस तरह दिखता है:(entry: QueueEntry) => {...}
-
एंट्री
QueueEntry
-
returns
प्रॉमिस<void>
-
QueueOptions
प्रॉपर्टी
-
forceSyncFallback
बूलियन ज़रूरी नहीं
-
maxRetentionTime
नंबर वैकल्पिक
-
ऑनसिंक
OnSyncCallback ज़रूरी नहीं
QueueStore
IndexedDB में सूची से अनुरोधों को मैनेज करने के लिए मैनेज की जाने वाली क्लास, आसानी से ऐक्सेस करने के लिए, सूची को उनके नाम से इंडेक्स किया जाता है.
ज़्यादातर डेवलपर को इस क्लास को सीधे ऐक्सेस करने की ज़रूरत नहीं होगी; यह बेहतर तरीके से इस्तेमाल किया जा सकता है.
प्रॉपर्टी
-
कंस्ट्रक्टर
अमान्य
इस इंस्टेंस को सूची इंस्टेंस के साथ जोड़ता है, ताकि जोड़ी गई एंट्री ये हो सकती हैं इसकी पहचान उनकी सूची के नाम से की जाती है.
constructor
फ़ंक्शन इस तरह दिखता है:(queueName: string) => {...}
-
queueName
स्ट्रिंग
-
returns
-
-
deleteEntry
अमान्य
दिए गए आईडी की एंट्री को मिटाता है.
चेतावनी: इस तरीके से यह पक्का नहीं होता कि मिटाई गई एंट्री इससे जुड़ी है सूची (यानी
queueName
से मेल खाती है). हालांकि, यह सीमा स्वीकार की जा सकती है क्योंकि यह क्लास सार्वजनिक तौर पर ज़ाहिर नहीं की जाती. एक और जाँच करने पर यह तरीका काफ़ी धीमा है.deleteEntry
फ़ंक्शन इस तरह दिखता है:(id: number) => {...}
-
आईडी
संख्या
-
returns
प्रॉमिस<void>
-
-
getAll
अमान्य
स्टोर की
queueName
से मिलती-जुलती सभी एंट्री दिखाता है.getAll
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
Promise<QueueStoreEntry[]>
-
-
popEntry
अमान्य
queueName
से मिलान करने वाली सूची की आखिरी एंट्री को हटाकर, उसे दिखाता है.popEntry
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
Promise<QueueStoreEntry>
-
-
pushEntry
अमान्य
सूची के आखिरी हिस्से में कोई एंट्री जोड़ें.
pushEntry
फ़ंक्शन इस तरह दिखता है:(entry: UnidentifiedQueueStoreEntry) => {...}
-
एंट्री
UnidentifiedQueueStoreEntry
-
returns
प्रॉमिस<void>
-
-
shiftEntry
अमान्य
queueName
से मिलान करने वाली सूची की पहली एंट्री को हटाकर, उसे नतीजे के तौर पर दिखाता है.shiftEntry
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
Promise<QueueStoreEntry>
-
-
साइज़
अमान्य
queueName
से मेल खाने वाले स्टोर में एंट्री की संख्या दिखाता है.size
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
Promise<number>
-
-
unshiftEntry
अमान्य
सूची में पहले कोई एंट्री जोड़ें.
unshiftEntry
फ़ंक्शन इस तरह दिखता है:(entry: UnidentifiedQueueStoreEntry) => {...}
-
एंट्री
UnidentifiedQueueStoreEntry
-
returns
प्रॉमिस<void>
-
StorableRequest
अनुरोधों को क्रम से लगाने और क्रम से लगाने की प्रोसेस को आसान बनाने के लिए क्लास, ताकि वे को IndexedDB में सेव किया जा सकता है.
ज़्यादातर डेवलपर को इस क्लास को सीधे ऐक्सेस करने की ज़रूरत नहीं होगी; यह बेहतर तरीके से इस्तेमाल किया जा सकता है.
प्रॉपर्टी
-
कंस्ट्रक्टर
अमान्य
यह अनुरोध डेटा के उस ऑब्जेक्ट को स्वीकार करता है जिसका इस्तेमाल
Request
है, लेकिन इसे IndexedDB में भी सेव किया जा सकता है.constructor
फ़ंक्शन इस तरह दिखता है:(requestData: RequestData) => {...}
-
requestData
RequestData
अनुरोध किए गए डेटा का ऑब्जेक्ट, जिसमें
url
और इसकी सभी काम की प्रॉपर्टी [requestInit]https://fetch.spec.whatwg.org/#requestinit
.
-
returns
-
-
क्लोन
अमान्य
इंस्टेंस का डीप क्लोन बनाता है और दिखाता है.
clone
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
-
-
toObject
अमान्य
_requestData
ऑब्जेक्ट के इंस्टेंस का डीप क्लोन दिखाता है.toObject
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
RequestData
-
-
toRequest
अमान्य
इस इंस्टेंस को अनुरोध में बदलता है.
toRequest
फ़ंक्शन इस तरह दिखता है:() => {...}
-
returns
अनुरोध
-
-
fromRequest
अमान्य
यह अनुरोध ऑब्जेक्ट को ऐसे सादे ऑब्जेक्ट में बदलता है जिसे स्ट्रक्चर्ड किया जा सकता है क्लोन किया गया या JSON फ़ाइल किया गया.
fromRequest
फ़ंक्शन इस तरह दिखता है:(request: Request) => {...}
-
CANNOT TRANSLATE
अनुरोध
-
returns
Promise<StorableRequest>
-