5

PushManager.getSubscription()क्या बीच का अंतर कर रहे हैं `pushManager.subscribe` और` pushManager.getSubscription` सेवा कार्यकर्ता

Retrieves an existing push subscription. It returns a Promise that resolves to a PushSubscription object containing details of an existing subscription. If no existing subscription exists, this resolves to a null value.

[...]

PushManager.subscribe()

Subscribes to a push service. It returns a Promise that resolves to a PushSubscription object containing details of a push subscription. A new push subscription is created if the current service worker does not have an existing subscription.

MDN के pushManager प्रलेखन के अनुसार। getSubcription() के मामले में यह शून्य बिंदु के साथ हल हो सकता है, इस बिंदु को छोड़कर, विधियां काफी समान हैं।

मैं मूल रूप से समझता हूं कि मैं बस subscribe() का उपयोग कर सकता हूं और सेवा कर्मचारी इसे उपलब्ध होने पर सदस्यता प्राप्त करने का प्रयास करेगा, और यदि यह उपलब्ध न हो तो नया भी बनाएं।

=> लेकिन मैं कुछ और करने की कोशिश कर रहा था। मैं पहले सदस्यता प्राप्त करने की कोशिश करना चाहता हूं, अगर यह null के साथ हल हो गया है तो मैं इसे सब्सक्राइब करने का प्रयास करूंगा।

navigator.serviceWorker.register('./worker.js') 
    .then(function(reg) { 

     // Subscribe push manager 
     reg.pushManager.getSubscription() 
     .then(function(subscription) { 

      if(subscription){ 
       // TODO... get the enpoint here 
      } else { 
       reg.pushManager.subscribe() 
       .then(function(sub){ 
        // TODO... get the endpoint here 
       }); 
      } 

     }, function(error) { 
      console.error(error); 
     }) 
    }); 

लेकिन तब मैं त्रुटि के साथ समाप्त हो गया हूँ:

Uncaught (in promise) DOMException: Subscription failed - no active Service Worker

यह भ्रामक है, और मैं इस सेवा कार्यकर्ता की पुश एपीआई पर क्रोम की एक सीमा है पर शक कर रहा हूँ या संभवतः एक बग कर सकते हैं। क्या किसी के पास इस अजीब व्यवहार के बारे में कोई जानकारी है?

उत्तर

6

समस्या यह है कि आपका सेवा कर्मचारी पंजीकृत है, लेकिन यह अभी तक सक्रिय नहीं है।

आप सेवा कर्मचारी को पंजीकृत करने के बाद सही सदस्यता लेने के बजाय navigator.serviceWorker.ready का उपयोग कर सकते हैं।

यदि आप जितनी जल्दी हो सके सेवा कार्यकर्ता को सक्रिय करना चाहते हैं, तो आप skipWaiting और Clients.claim का उपयोग कर सकते हैं, जैसा कि this ServiceWorker Cookbook recipe में वर्णित है।

+0

फिर से धन्यवाद! :) –

संबंधित मुद्दे