2015-05-15 22 views
8

Tôi gặp vấn đề sau khi đăng ký serviceWorker navigator.serviceWorker.controller luôn là null. Tôi không bao giờ làm một lực lượng làm mới và chỉ cần làm mới trang. Tôi thử nghiệm nó với Google Chrome 42.0.2311.152 m (32-Bit).navigator.serviceWorker.controller luôn là null

var currentServiceWorker = null; 
navigator.serviceWorker.register(SERVICE_WORKER_URL).then(function(serviceWorkerRegistration { 
    if (navigator.serviceWorker.controller) { 
    currentServiceWorker = navigator.serviceWorker.controller; 
    } else { 
    currentServiceWorker = serviceWorkerRegistration.active; 
    } 
}); 

Theo này:

Bộ điều khiển thuộc tính chỉ đọc của giao diện ServiceWorkerContainer trả về một đối tượng ServiceWorker nếu trạng thái của nó được kích hoạt (giống đối tượng được trả về bởi ServiceWorkerRegistration.active). Thuộc tính này trả về null nếu yêu cầu làm mới lực (Shift + refresh) hoặc nếu không có nhân viên hoạt động. (Nguồn: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller)

navigator.serviceWorker.controller nên trả về cùng một đối tượng là serviceWorkerRegistration.active. Nhưng với .active tôi nhận được công nhân hoạt động, với .controller không.

Bạn có ý tưởng nào về tình huống đó không?

Cảm ơn bạn, Andi

Trả lời

8

Điều đầu tiên tôi muốn nhìn vào khi gỡ lỗi này là liệu các trang hiện tại bạn đang ở trên thác nước thuộc phạm vi của người lao động dịch vụ. Nếu trang hiện tại của bạn không nằm trong phạm vi, trang đó sẽ không được kiểm soát (nhưng nhân viên dịch vụ bạn đã đăng ký vẫn có thể được coi là đang hoạt động).

Bạn đang gọi số register(SERVICE_WORKER_URL) theo mặc định, sử dụng thư mục chứa tập lệnh công nhân dịch vụ làm phạm vi. Đó là bình thường những gì bạn muốn, nhưng bạn cần phải chắc chắn rằng SERVICE_WORKER_URL đề cập đến một tập lệnh nằm ở gốc của trang web của bạn. Bằng cách đó, nó sẽ có thể kiểm soát các trang ở cả cùng một cấp độ gốc hoặc các trang trong các thư mục bên dưới gốc web của bạn. Vì vậy, nếu tệp JavaScript của nhân viên dịch vụ của bạn hiện đang nằm trong thư mục con /scripts/ hoặc thứ gì đó tương tự, hãy chuyển nó lên thư mục gốc.

Bạn có thể kiểm tra phạm vi hiện tại của nhân viên dịch vụ của mình bằng cách truy cập chrome://serviceworker-internals/ và xem phạm vi liên quan đến đăng ký của bạn là gì.

+0

đây là một cạm bẫy sử thi, tôi tin rằng nó phải được tài liệu tốt hơn - ít nhất một số thông báo lỗi rõ ràng sẽ được tốt đẹp. cảm ơn! – shabunc

+0

@shabunc đã giải quyết được vấn đề, tôi nhận được null trong bộ điều khiển. –

1

navigator.serviceWorker.register chỉ đăng ký serviceworker và kích hoạt nó. nhưng để có được bộ điều khiển trên serviceworker, bạn cần phải đặt serviceworker của bạn trong thư mục gốc công cộng để tất cả các trang sẽ nằm trong phạm vi và service worker sẽ được gắn vào nó.

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