getRegistration().затем дает просто неопределенное

#javascript #promise #push-notification #notifications #push-api

Вопрос:

Я практически ребенок Promise и serviceWorker все такое, и я понятия не имею, почему это происходит.

Я смотрел видео о веб-Push и уведомлениях. https://youtu.be/ggUY0Q4f5ok В 1:26 видео он представляет этот код и говорит: «Вы также можете попробовать это с консоли браузера. Попробуйте это на странице новой вкладки».

 function displayNotification(){
    if(Notification.permission === 'granted') {
        navigator.serviceWorker.getRegistration()
        .then(function(reg){
            reg.showNotification('Hello world!');
        });
    }
}
 

Я перешел на страницу новой вкладки и написал тот же код на консоли.
Но когда я позвонил displayNotification() , он бросил Uncaught (in promise) TypeError: Cannot read property 'showNotification' of undefined at <anonymous>:5:17 .

Поэтому я попробовал следующее:

 navigator.serviceWorker.getRegistration()
.then(reg=>{console.log(reg, this)});
 

Это дало undefined Window {window: Window, self: Window, document: document, name: "", location: Location, …} результат .
Я предполагаю Window , что объект-это результат getRegistration() , но тогда reg для чего?
Во всяком случае, тогда я попробовал следующее:

 navigator.serviceWorker.getRegistration()
.then(reg=>{this.showNotification('Hello world!');});
 

Но, это бросило Uncaught (in promise) TypeError: this.showNotification is not a function at <anonymous>:2:18

Была ли изменена грамматика, был ли в видео неправильный код, или я что-то пропустил?

Plus. Я действительно хочу развиваться Push API , но я не смог найти никаких простых учебников или быстрых стартов. Если возможно, порекомендуйте один из них, пожалуйста. Огромное спасибо.

Ответ №1:

 function displayNotification(){
    if(Notification.permission === 'granted') {
        navigator.serviceWorker.getRegistration()
        .then(function(reg){
            reg.showNotification('Hello world!');
        });
    }
}
 

Причина, по которой вы получаете: Uncaught (in promise) TypeError: Cannot read property 'showNotification' of undefined at <anonymous>:5:17

это потому, что вызов getRegistration() не дает вам действительного результата. В идеале функция getRegistration() должна возвращать объект регистрации, который будет иметь несколько методов и свойств, одним из которых является метод, называемый showNotification(). Очевидно, что в этом случае вызов getRegistration() возвращает что-то другое? Вероятно, нулевое или неопределенное значение или что-то в этом роде. Вы можете провести расследование, зарегистрировав результаты вызова следующим образом:

 function displayNotification(){
    if(Notification.permission === 'granted') {
        navigator.serviceWorker.getRegistration()
        .then(function(reg){
            console.log(reg);
        });
    }
}
 

Проблема, похоже, связана с тем, что вы не зарегистрировали работу службы перед вызовом getRegistration(). По крайней мере, я ожидал бы, что вы сделаете что-то подобное, прежде чем проверять регистрацию:

 navigator.serviceWorker.register('/service-worker.js');
 

Комментарии:

1. Огромное спасибо. Я буду больше изучать работников сферы услуг и сделаю это с вашей помощью о регистрации работника сферы услуг!