เมื่อส่งข้อมูลไปยังเว็บเซิร์ฟเวอร์ คำขออาจล้มเหลวในบางครั้ง ทั้งนี้ อาจเป็นเพราะผู้ใช้ขาดการเชื่อมต่อ หรืออาจเป็นเพราะ เซิร์ฟเวอร์ขัดข้อง ไม่ว่าในกรณีใดก็ตาม คุณควรลองส่งคำขอ อีกครั้งในภายหลัง
BackgroundSync API ใหม่ คือวิธีการแก้ปัญหานี้ที่ดี เมื่อโปรแกรมทำงานของบริการตรวจพบว่า คำขอเครือข่ายล้มเหลว เครือข่ายสามารถลงทะเบียนเพื่อรับเหตุการณ์ sync
ซึ่งจะส่งเมื่อเบราว์เซอร์คิดว่าการเชื่อมต่อกลับมาแล้ว โปรดทราบว่าระบบจะส่งเหตุการณ์การซิงค์ได้ แม้ว่าผู้ใช้จะออกจาก แอปพลิเคชัน จึงมีประสิทธิภาพมากกว่าวิธีการดั้งเดิม กำลังลองส่งคำขอที่ล้มเหลวอีกครั้ง
การซิงค์พื้นหลังของ Workbox ได้รับการออกแบบมาเพื่อใช้ BackgroundSync API และผสานรวมการใช้งานกับโมดูล Workbox อื่นๆ ทั้งนี้ ใช้กลยุทธ์ทางเลือกสำรองสำหรับเบราว์เซอร์ที่ยังไม่ได้ใช้ BackgroundSync
เบราว์เซอร์ที่รองรับ BackgroundSync API จะเล่นซ้ำโดยอัตโนมัติไม่สำเร็จ ในนามของคุณที่ ที่มีการจัดการโดยเบราว์เซอร์ ซึ่งมีแนวโน้มที่จะใช้ Exponential Backoff ระหว่างการเล่นซ้ำ ในเบราว์เซอร์ที่ ไม่รองรับ BackgroundSync API ตั้งแต่ต้น การซิงค์พื้นหลังของ 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
Callback ของปลั๊กอิน และ ระบบจะเรียกใช้ 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 คุณต้องสร้างคิวด้วย ชื่อคิว (ซึ่งต้องไม่ซ้ำกันสำหรับ origin):
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()); });
เมื่อเพิ่มลงในคิวแล้ว ระบบจะส่งคำขอซ้ำโดยอัตโนมัติเมื่อ Service Worker ได้รับเหตุการณ์ sync
(ซึ่งเกิดขึ้นเมื่อเบราว์เซอร์ คิดว่าการเชื่อมต่อกลับคืนมา) เบราว์เซอร์ที่ไม่รองรับแท็ก BackgroundSync API จะลองเข้าคิวใหม่ทุกครั้งที่โปรแกรมทำงานของบริการ ขึ้นมา ซึ่งกำหนดให้หน้าเว็บที่ควบคุมโปรแกรมทำงานของบริการต้อง จึงจะทำงานได้ไม่ดีนัก
การทดสอบการซิงค์พื้นหลังของกล่องงาน
การทดสอบ BackgroundSync ค่อนข้างง่ายและยาก ด้วยเหตุผลหลายประการ
วิธีที่ดีที่สุดในการทดสอบการติดตั้งใช้งานคือดำเนินการดังต่อไปนี้
- โหลดหน้าเว็บและลงทะเบียน Service Worker ของคุณ
- ปิดเครือข่ายของคอมพิวเตอร์หรือปิดเว็บเซิร์ฟเวอร์
- อย่าใช้นักพัฒนาซอฟต์แวร์ Chrome แบบออฟไลน์ ช่องทำเครื่องหมายออฟไลน์ใน เครื่องมือสำหรับนักพัฒนาเว็บจะมีผลเฉพาะกับคำขอจากหน้าเว็บเท่านั้น คำขอ Service Worker จะยังดำเนินต่อไป
- สร้างคำขอเครือข่ายที่ควรอยู่ในคิวกับการซิงค์พื้นหลังของ Workbox
- คุณสามารถตรวจสอบคำขอที่อยู่ในคิวได้โดยดูที่
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
คลาสที่ใช้ Callback วงจรชีวิต fetchDidFail
จึงทำให้ เพิ่มคำขอที่ล้มเหลวไปยังคิวการซิงค์ในเบื้องหลังได้ง่ายขึ้น
พร็อพเพอร์ตี้
- เครื่องมือสร้าง
เป็นโมฆะ
ฟังก์ชัน
constructor
มีลักษณะดังนี้(name: string, options?: QueueOptions) => {...}
- ชื่อ
สตริง
โปรดดู
workbox-background-sync.Queue
สำหรับรายละเอียดพารามิเตอร์ - ตัวเลือก
QueueOptions ไม่บังคับ
- returns
-
Queue
คลาสสำหรับจัดการการจัดเก็บคำขอที่ล้มเหลวใน IndexedDB แล้วลองใหม่ ในภายหลัง ทุกส่วนของกระบวนการจัดเก็บและการเล่นซ้ำสามารถสังเกตได้ผ่านทาง Callback
พร็อพเพอร์ตี้
- เครื่องมือสร้าง
เป็นโมฆะ
สร้างอินสแตนซ์ของคิวที่มีตัวเลือกที่ระบุ
ฟังก์ชัน
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
คำสัญญา<โมฆะ>
-
- registerSync
เป็นโมฆะ
ลงทะเบียนเหตุการณ์การซิงค์ที่มีแท็กเฉพาะสำหรับอินสแตนซ์นี้
ฟังก์ชัน
registerSync
มีลักษณะดังนี้() => {...}
- returns
คำสัญญา<โมฆะ>
-
- replayRequests
เป็นโมฆะ
วนซ้ำคำขอแต่ละรายการในคิวและพยายามดึงข้อมูลอีกครั้ง หากไม่สามารถดึงข้อมูลคำขอใดๆ ได้ ระบบจะนำคำขอนั้นกลับไปยังตำแหน่งเดิมใน คิว (ซึ่งจะบันทึกการลองใหม่สำหรับเหตุการณ์การซิงค์ครั้งถัดไป)
ฟังก์ชัน
replayRequests
มีลักษณะดังนี้() => {...}
- returns
คำสัญญา<โมฆะ>
-
- shiftRequest
เป็นโมฆะ
นำออกและส่งกลับคำขอแรกในคิว (พร้อมด้วย และข้อมูลเมตาทั้งหมด) ออบเจ็กต์ที่แสดงผลจะอยู่ในรูปแบบ
{request, timestamp, metadata}
ฟังก์ชัน
shiftRequest
มีลักษณะดังนี้() => {...}
- returns
Promise<QueueEntry>
-
- ขนาด
เป็นโมฆะ
แสดงผลจำนวนรายการที่อยู่ในคิว โปรดทราบว่ารายการที่หมดอายุ (ต่อ
maxRetentionTime
) จะรวมอยู่ในจำนวนนี้ด้วยเช่นกันฟังก์ชัน
size
มีลักษณะดังนี้() => {...}
- returns
Promise<number>
-
- unshiftRequest
เป็นโมฆะ
จัดเก็บคำขอที่ส่งผ่านใน IndexedDB (พร้อมการประทับเวลาและ ข้อมูลเมตา) ที่จุดเริ่มต้นของคิว
ฟังก์ชัน
unshiftRequest
มีลักษณะดังนี้(entry: QueueEntry) => {...}
- รายการ
QueueEntry
- returns
คำสัญญา<โมฆะ>
-
QueueOptions
พร็อพเพอร์ตี้
- forceSyncFallback
บูลีน ไม่บังคับ
- maxRetentionTime
หมายเลข ไม่บังคับ
- การซิงค์
OnSyncCallback ไม่บังคับ
QueueStore
คลาสสำหรับจัดการการจัดเก็บคำขอจากคิวใน IndexedDB จัดทำดัชนีตามชื่อคิวเพื่อให้เข้าถึงได้ง่ายขึ้น
นักพัฒนาแอปส่วนใหญ่ไม่จำเป็นต้องเข้าถึงชั้นเรียนนี้โดยตรง สำหรับ Use Case ขั้นสูง
พร็อพเพอร์ตี้
- เครื่องมือสร้าง
เป็นโมฆะ
เชื่อมโยงอินสแตนซ์นี้กับอินสแตนซ์คิว เพื่อให้รายการที่เพิ่มสามารถ ที่ระบุตามชื่อคิว
ฟังก์ชัน
constructor
มีลักษณะดังนี้(queueName: string) => {...}
- queueName
สตริง
- returns
-
- deleteEntry
เป็นโมฆะ
ลบรายการสำหรับรหัสที่กำหนด
คำเตือน: วิธีนี้ไม่รับรองว่ารายการที่ถูกลบเป็นของ คิว (นั่นคือ ตรงกับ
queueName
) แต่ข้อจำกัดนี้ยอมรับได้ เนื่องจากชั้นเรียนนี้จะไม่ปรากฏต่อสาธารณะ การตรวจสอบเพิ่มเติมจะทำให้ วิธีนี้ช้ากว่าที่จำเป็นฟังก์ชัน
deleteEntry
มีลักษณะดังนี้(id: number) => {...}
- id
ตัวเลข
- returns
คำสัญญา<โมฆะ>
-
- getAll
เป็นโมฆะ
แสดงรายการทั้งหมดใน Store ที่ตรงกับ
queueName
ฟังก์ชัน
getAll
มีลักษณะดังนี้() => {...}
- returns
Promise<QueueStoreEntry[]>
-
- popEntry
เป็นโมฆะ
นำออกและแสดงผลรายการสุดท้ายในคิวที่ตรงกับ
queueName
ฟังก์ชัน
popEntry
มีลักษณะดังนี้() => {...}
- returns
Promise<QueueStoreEntry>
-
- pushEntry
เป็นโมฆะ
เพิ่มรายการเป็นลำดับสุดท้ายในคิว
ฟังก์ชัน
pushEntry
มีลักษณะดังนี้(entry: UnidentifiedQueueStoreEntry) => {...}
- รายการ
UnidentifiedQueueStoreEntry
- returns
คำสัญญา<โมฆะ>
-
- shiftEntry
เป็นโมฆะ
นำออกและแสดงผลรายการแรกในคิวที่ตรงกับ
queueName
ฟังก์ชัน
shiftEntry
มีลักษณะดังนี้() => {...}
- returns
Promise<QueueStoreEntry>
-
- ขนาด
เป็นโมฆะ
แสดงผลจำนวนรายการใน Store ที่ตรงกับ
queueName
ฟังก์ชัน
size
มีลักษณะดังนี้() => {...}
- returns
Promise<number>
-
- unshiftEntry
เป็นโมฆะ
แทรกรายการในคิวก่อน
ฟังก์ชัน
unshiftEntry
มีลักษณะดังนี้(entry: UnidentifiedQueueStoreEntry) => {...}
- รายการ
UnidentifiedQueueStoreEntry
- returns
คำสัญญา<โมฆะ>
-
StorableRequest
คลาสที่ช่วยให้ง่ายต่อการเรียงลำดับและแยกอนุกรมคำขอเพื่อให้ สามารถจัดเก็บใน IndexedDB ได้
นักพัฒนาแอปส่วนใหญ่ไม่จำเป็นต้องเข้าถึงชั้นเรียนนี้โดยตรง สำหรับ Use Case ขั้นสูง
พร็อพเพอร์ตี้
- เครื่องมือสร้าง
เป็นโมฆะ
ยอมรับข้อมูลออบเจ็กต์คำขอที่ใช้สร้าง
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-stringified
ฟังก์ชัน
fromRequest
มีลักษณะดังนี้(request: Request) => {...}
- ส่งคำขอ
ส่งคำขอ
- returns
Promise<StorableRequest>
-