在responseWith中使用异步功能

问题描述

我有一个异步函数,用于在'fetch'eventListener中进行缓存,然后在'respondWith()'中以'await'调用函数,但是它不起作用。

PS:当我不等待它的工作就叫它

self.addEventListener('fetch',async e => {
      const req = e.request;
      e.respondWith(await networkAndCache(req));
      console.log('fetch');
});

async function networkAndCache(req) {
  const cache = await caches.open(cacheName);
  try {
    const fresh = await fetch(req);
    console.log('fresh');
    await cache.put(req,fresh.clone());
    console.log('put');
    return fresh;
  } catch (e) {
    const cached = await cache.match(req);
    console.log('cached');
    return cached || caches.match(offlineUrl);;
  }
}

解决方法

您必须同步呼叫respondWith。如果您使用await,则respondWith将在事件处理过程之外的将来某个时间被调用。既然在外面,浏览器就认为处理事件不成功。

为了能够使用异步函数的结果,respondWith还接受一个诺言,这是如果您不使用 await所得到的

是的,不使用await是这里的方法。

来源: