javascript - Service Worker Promise.then 未定义

标签 javascript promise es6-promise service-worker

我有这个代码:

self.addEventListener('fetch', function(event) {
const promiseChain = doSomethingAsync()
      .then(() => doSomethingAsyncThatReturnsAURL(event))
      .then(someUrl => fetch(someUrl));
event.respondWith(promiseChain);
});

它一直给我这个错误:

Uncaught TypeError: Cannot read property 'then' of undefined

它在这一行拾取它:

.then(() => doSomethingAsyncThatReturnsAURL(event))

以供引用:

这是函数 doSomethingAsyncThatReturnsAURL:

function doSomethingAsyncThatReturnsAURL(event) {
  var location = self.location;

  console.log("loc", location)

  self.clients.matchAll({includeUncontrolled: true}).then(clients => {
    for (const client of clients) {
      const clientUrl = new URL(client.url);
      console.log("SO", clientUrl);
      if(clientUrl.searchParams.get("url") != undefined && clientUrl.searchParams.get("url") != '') {
        location = client.url;
      }
    }

  console.log("loc2", location)

  var url = new URL(location).searchParams.get('url').toString();

  console.log(event.request.hostname);
  var toRequest = event.request.url;
  console.log("Req:", toRequest);

  var parser2 = new URL(location);
  var parser3 = new URL(url);

  var parser = new URL(toRequest);

  console.log("if",parser.host,parser2.host,parser.host === parser2.host);
  if(parser.host === parser2.host) {
    toRequest = toRequest.replace('https://booligoosh.github.io',parser3.protocol + '//' +  parser3.host);
    console.log("ifdone",toRequest);
  }

  console.log("toRequest:",toRequest);

  var finalResult = 'https://cors-anywhere.herokuapp.com/' + toRequest;

  return finalResult;

  });
}

还有 doSomethingAsync 函数:

function doSomethingAsync() {
      console.log("ASYNC LOL");
}

最佳答案

无法读取未定义的属性“then””告诉您 doSomethingAsync() 调用不会返回具有 then 属性的对象。我想说的是 doSomethingAsync 必须返回 Promise 。 Promise 对象在其原型(prototype) ( MDN ) 上有 then 方法,因此您可以调用它。试试这个

function doSomethingAsync() {
  return new Promise(resolve => {
    console.log("ASYNC LOL");
    resolve();
  })
}

或者只是

function doSomethingAsync() {
  console.log("ASYNC LOL");
  return Promise.resolve();
}

关于javascript - Service Worker Promise.then 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46841412/

相关文章:

javascript - 有没有办法让 javascript 链接在 IE 中打开?

asynchronous - JavaScript ES6 类可以与异步代码库一起使用吗?

javascript - Bootstrap : on hover in Dropdown menu parent menu highlighted

javascript - 禁用 js 脚本 (buttons.js) 整个布局都会发生变化。为什么?

javascript - 我如何等待 Angular4 HttpClient 响应?

javascript - 如何编写通用的可重用的 Promise then/catch 处理程序?

javascript - 在 Promise 解析后使用 Sinon 进行测试

javascript - 使用回调导入模块

javascript - Reactjs 在特定时间后连续发送 Promise

javascript - jQuery 宽度变化检测