1

Мне нужен идентификатор регистрации chrome для отправки его в качестве параметра вызова API, поэтому я могу получить сообщение, соответствующее идентификатору регистрации. Мой код выглядит следующим образом:Не удалось выполнить 'waitUntil' в 'ExtendableEvent'

self.addEventListener('push', function(event) { 

var apiPath = 'http://localhost/api/v1/notification/getNotification?regId='; 
event.waitUntil(registration.pushManager.getSubscription().then(function (subscription){ 
    apiPath = apiPath + subscription.endpoint.split("/").slice(-1); 
    event.waitUntil(fetch(apiPath).then(function(response){ 
     if(response.status !== 200){ 
      console.log("Problem Occurred:"+response.status); 
      throw new Error(); 
     } 
     return response.json().then(function(data){ 
      var title = data.title; 
      var message = data.body; 
      var icon = data.icon; 
      var tag = data.tag; 
      var url = data.url; 
      return self.registration.showNotification(title,{ 
       body: message, 
       icon: icon, 
       tag: tag, 
       data: url 
      }); 
     }) 
    }).catch(function(err){ 
     var title = 'Notification'; 
     var message = 'You have new notifications'; 
     return self.registration.showNotification(title,{ 
       body: message, 
       icon: '/images/Logo.png', 
       tag: 'Demo', 
       data: 'http://www.google.com/' 
      }); 
    }) 
    ) 
})); 
return; 
}); 

Ошибка я получаю с выше код:

Uncaught (обещанию) DOMException:

Не удалось выполнить 'waitUntil' на «ExtendableEvent»: обработчик событий уже завершен. (...) вместе с дополнительным уведомлением «Сайт обновлен в фоновом режиме». Теперь, даже если я удалю event.waitUntil перед номером fetch(apiPath), я до сих пор получаю это дополнительное уведомление.

Пожалуйста, помогите мне найти решение этого вопроса.

P.S: Вопрос в Chrome Push Notification: This site has been updated in the background, кажется, не имеет смысла в моем случае.

ответ

3

Не нужно называть event.waitUntil несколько раз. Вам просто нужно позвонить ему один раз и передать ему обещание, продолжительность жизни мероприятия будет продлена до тех пор, пока обещание не будет разрешено.

self.addEventListener('push', function(event) { 
    var apiPath = 'http://localhost/api/v1/notification/getNotification?regId='; 

    event.waitUntil(
    registration.pushManager.getSubscription() 
    .then(function(subscription) { 
     apiPath = apiPath + subscription.endpoint.split("/").slice(-1); 

     return fetch(apiPath) 
     .then(function(response) { 
     if (response.status !== 200){ 
      console.log("Problem Occurred:"+response.status); 
      throw new Error(); 
     } 

     return response.json(); 
     }) 
     .then(function(data) { 
     return self.registration.showNotification(data.title, { 
      body: data.body, 
      icon: data.icon, 
      tag: data.tag, 
      data: data.url, 
     }); 
     }) 
     .catch(function(err) { 
     return self.registration.showNotification('Notification', { 
      body: 'You have new notifications', 
      icon: '/images/Logo.png', 
      tag: 'Demo', 
      data: 'http://www.google.com/' 
     }); 
     }); 
    }) 
); 
}); 
+0

Я просто вернул объект обещание и сделал работу заменен 'т.е. event.waitUntil' с' return' – doubt

+0

Да, действительно. Я просто немного изменил отступы, чтобы было легче читать для меня, но это суть. – Marco