我正在尝试在获取处理程序代码中实现AbortSignal
。到目前为止,它在前端代码中非常容易工作。每当我在上一个请求完成之前再次调用同一请求时,它将中止该请求并执行下一个请求。
但是,看来服务工作者AbortSignal
中的event.request.signal
不是我在请求中传递的实例。当我中止请求时,Service Worker中的请求永远不会中止。
This article解释了AbortSignal
应该如何触发Service Worker请求的信号,因为它是同一请求。不过,这篇文章似乎描述了计划中的规范,因此我不知道它是以不同的方式实现还是完全实现。
下面是代码的简化版本。
在前端调用请求:
// abort any running requests
if (this.controller) this.controller.abort();
// initialize the new request
this.controller = new AbortController();
const options = {
method: 'GET',
signal: this.controller.signal
};
// execute request
const response = await fetch(url, options);
// the request can't be aborted after it has finished
this.controller = null;
在服务工作者中处理提取:
self.addEventListener('fetch', (event) => {
// it seems that event.request.signal is NOT the instance
// that was passed in the above code
return fetch(event.request);
});