小编Mar*_*c A的帖子

结合两个承诺

我对JavaScript和承诺都很陌生,说实话我并不完全理解promises是如何工作的,所以我需要一些帮助.

我正在使用Google Cloud Messaging将通知从我的网站推送给我的用户.当用户收到通知并单击它时,它会打开存储在IndexedDB中的URL.

importScripts('IndexDBWrapper.js');
var KEY_VALUE_STORE_NAME = 'key-value-store', idb;

function getIdb() {
  if (!idb) {
    idb = new IndexDBWrapper(KEY_VALUE_STORE_NAME, 1, function (db) {
      db.createObjectStore(KEY_VALUE_STORE_NAME);
    });
  }
  return idb;
}

self.addEventListener('notificationclick', function (event) {
  console.log('On notification click: ', event);
  event.notification.close();
  event.waitUntil(getIdb().get(KEY_VALUE_STORE_NAME, event.notification.tag).then(function (url) {
    var redirectUrl = '/';
    if (url) redirectUrl = url;
      return clients.openWindow(redirectUrl);
  }));
});
Run Code Online (Sandbox Code Playgroud)

所以在上面的代码中,我知道getIdb()... then()是一个promise,但event.waitUntil也是一个承诺?

上述代码的问题在于,每次点击通知时都会打开Chrome的一个实例,我希望它会利用现有的实例(如果可用).以下是这样的:

self.addEventListener('notificationclick', function(event) {  
  console.log('On notification click: ', event.notification.tag);  
  event.notification.close();
  event.waitUntil(
    clients.matchAll({  
      type: "window"  
    })
    .then(function(clientList) {  
      for (var i = …
Run Code Online (Sandbox Code Playgroud)

javascript push-notification promise service-worker

7
推荐指数
2
解决办法
1万
查看次数