Tôi đang suy nghĩ về việc đưa ứng dụng của mình sang chế độ ngoại tuyến bằng cách sử dụng nhân viên dịch vụ. Tôi đã đạt được kết quả thỏa mãn với các tài nguyên lưu trong bộ nhớ đệm, nhưng tôi cũng phải kiểm tra xem có tìm được kết nối Internet hay không, nếu không - lưu trữ yêu cầu và đẩy nó vào.
Tôi hiểu rằng tiện ích trong tương lai sẽ trợ giúp điều đó, nhưng tôi cần - ngay cả giải pháp tạm thời cho điều đó.
Tôi đã cố gắng để lưu trữ các yêu cầu trong một mảng trong nhân viên, nhưng nó không liên tục - không hoạt động sau khi khởi động lại máy tính (trong khi SW hoạt động và phục vụ nội dung ngoại tuyến).
Hướng tốt - lưu trữ trong bộ nhớ cache như tệp bằng cách nào đó? Hoặc sử dụng IndexedDB/SimpleDB (Accessing indexedDB in ServiceWorker. Race condition)?Lưu trữ yêu cầu REST với nhân viên dịch vụ để đồng bộ hóa chúng
Trả lời
Có ví dụ tại https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics sử dụng nhân viên dịch vụ để phát hiện lỗi cho một số loại yêu cầu nhất định (trong trường hợp này, Google Analytics ping qua HTTP GET
) và xếp hàng lỗi bằng cách sử dụng IndexedDB
. Hàng đợi được kiểm tra mỗi khi nhân viên dịch vụ khởi động và nếu yêu cầu có thể được "phát lại" thành công (vì mạng hiện có sẵn), nó sẽ bị xóa khỏi hàng đợi. Mặc dù không có đảm bảo về thời điểm nhân viên dịch vụ sẽ khởi động (sự kiện đồng bộ hóa nền sẽ giúp bạn trong tương lai), bạn có thể giả định rằng nếu ai đó đang tích cực sử dụng ứng dụng web của bạn thì nhân viên dịch vụ sẽ tự phục hồi.
này có thể được khái quát hóa để loại yêu cầu, như HTTP POST
s, nhưng có một vài điều để suy nghĩ về:
- Hãy chắc chắn rằng người dùng của bạn nhận thức được rằng HTTP họ
POST
đang được xếp hàng đợi và sẽ được phát lại. Vì HTTPPOST
s thường sửa đổi trạng thái phía máy chủ, bạn không muốn làm người dùng ngạc nhiên khi có điều gì đó thay đổi do yêu cầu được phát lại là X giờ cũ. - Tùy thuộc vào dịch vụ bạn đang gọi, HTTP
POST
có thể yêu cầu tiêu đềAuthorization
hợp lệ. Nếu bạn đang sử dụng OAuth 2 để ủy quyền, nó có thể sử dụng mã thông báo truy cập có thời lượng giới hạn. Mã thông báo ủy quyền hợp lệ trước đó có thể hết hạn vào lúc bạn phát lại yêu cầu. IndexedDB
là lựa chọn tốt để xếp hàng các yêu cầu của bạn, vì nó cung cấp tính linh hoạt trong việc lưu trữ dữ liệu tùy ý và có thể lưu trữ cơ thể của HTTPPOST
mà không cần nhiều công việc. Nếu bạn không thể sử dụngIndexedDB
(bạn nói nó không được hỗ trợ sử dụng Cordova), sau đó chỉ có lựa chọn nào khác tôi có thể nghĩ đến sẽ là để cố gắng tận dụng các Cache Storage API để tạo ra một mới "đợi" bộ nhớ cache, với thất bạiRequest
s như các phím và rỗngResponse
đối tượng làm giá trị. Tại công nhân khởi động dịch vụ, bạn có thể sử dụng phương phápkeys()
trên bộ nhớ cache "đợi" của bạn để có được một danh sách của tất cả cácRequests
, và cho mỗi , gọifetch(queuedRequest)
để phát lại nó. Tôi đã không thử phương pháp này trước đây, nhưng tôi nghĩ nó sẽ hoạt động.
Câu trả lời hoàn hảo, cảm ơn bạn Jeff! –
Ai cũng có thể cung cấp một ví dụ về cách lưu trữ cơ thể của POST HTTP vào IndexedDB và sau đó lấy nó? – alearg
- 1. Nhân viên dịch vụ có thể lưu trữ các yêu cầu POST không?
- 2. Tại sao yêu cầu tìm nạp phải được nhân bản trong nhân viên dịch vụ?
- 3. Dịch vụ REST REST không nhận ra yêu cầu PUT
- 4. Thấy nếu yêu cầu thành công từ bên trong một nhân viên dịch vụ
- 5. Đồng bộ hóa ba yêu cầu ajax
- 6. Dịch vụ đồng bộ hóa và iOS
- 7. Yêu cầu về bộ nhớ và yêu cầu lưu trữ
- 8. yêu cầu lưu trữ bộ nhớ cache?
- 9. Node.JS Đợi gọi lại dịch vụ REST yêu cầu HTTP
- 10. Yêu cầu đồng bộ NSURLConnection từ yêu cầu đồng bộ so với yêu cầu không đồng bộ
- 11. Ý kiến về các yêu cầu đồng bộ trong nhân viên web
- 12. Nhân viên đồng bộ với chuỗi giao diện người dùng
- 13. Nhân viên dịch vụ không cập nhật
- 14. Cách đồng bộ hóa CoreData và dịch vụ web REST một cách không đồng bộ và đồng thời truyền bá đúng bất kỳ lỗi REST nào vào giao diện người dùng
- 15. Lưu trữ nhiều hợp đồng trong một dịch vụ WCF
- 16. Làm cách nào để lưu trữ các dịch vụ web REST trên Android?
- 17. Viết một dịch vụ để đồng bộ hóa hai thư mục?
- 18. Phiên trong các dịch vụ REST
- 19. Parse.com có phải là dịch vụ thích hợp để sao lưu/đồng bộ hóa với SQLite trong Android không?
- 20. IIS 7.5 lưu trữ dịch vụ WCF ném EndpointNotFoundException với 404 chỉ cho các yêu cầu lớn
- 21. Yêu cầu đồng bộ với Websockets
- 22. Cách đồng bộ hóa hai kho lưu trữ git
- 23. Pubnub thực hiện yêu cầu đồng bộ hóa
- 24. Dịch vụ lưu trữ LoopBack, tải lên trực tiếp (không có đối tượng yêu cầu)
- 25. Thông báo đẩy nhân viên dịch vụ với Angular2
- 26. Đồng bộ hóa với RestKit
- 27. nhân viên dịch vụ Đăng ký thất bại với localhost
- 28. Số lượng ajax đồng bộ, không đồng bộ yêu cầu
- 29. Yêu cầu dịch vụ AJAX với webmethod trong trang ASPX
- 30. Yêu cầu dịch vụ web bảo mật
Nó không phải là rất rõ ràng vấn đề của bạn là gì. Nếu câu hỏi của bạn là liệu IndexedDB có thể được sử dụng để lưu trữ ngoại tuyến, thì có, nó có thể. Nếu bạn không biết làm thế nào để làm các hoạt động lưu trữ của bạn để họ hỗ trợ cả hai chế độ trực tuyến và ngoại tuyến, sau đó bạn có thể xem những gì họ đề nghị ở đây: http://stackoverflow.com/questions/22342836/syncing-indexeddb-with-sql -server – dekkard
Cảm ơn nhưng tôi đang tìm cách lưu trữ các yêu cầu POST trong Service Worker khi tôi ngoại tuyến để đồng bộ hóa chúng khi tôi truy cập trực tuyến. Lưu trữ chúng trong IndexedDB có thể là một câu trả lời, nhưng IndexedDB không được hỗ trợ bởi [Cordova Plugin] (https://github.com/MobileChromeApps/cordova-plugin-service-worker/blob/master/README.md), và nó cách duy nhất để sử dụng Nhân viên dịch vụ hiện có trên iOS. –