2015-04-24 16 views
6

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

+1

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

+0

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. –

Trả lời

19

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ì HTTP POST 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 HTTP POST mà không cần nhiều công việc. Nếu bạn không thể sử dụng IndexedDB (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ại Request s như các phím và rỗng Response đố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áp keys() trên bộ nhớ cache "đợi" của bạn để có được một danh sách của tất cả các Requests, và cho mỗi , gọi fetch(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.
+1

Câu trả lời hoàn hảo, cảm ơn bạn Jeff! –

+0

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

Các vấn đề liên quan