I have this code in my Service Worker:
self.addEventListener('fetch', (event) => {
event.respondWith(new Promise(async (resolve, reject) => {
const req = event.request;
try {
const res = new HTTPResponse(resolve, reject);
await chain_handlers(this._middlewares, function(fn, next) {
return fn(req, res, next);
});
const method = req.method;
const url = new URL(req.url);
const path = normalize_url(url.pathname);
const routes = this._routes[method];
if (routes) {
const match = this._parser.pick(routes, path);
if (match.length) {
const [first_match] = match;
const fns = [...this._middlewares, ...routes[first_match.pattern]];
req.params = first_match.data;
setTimeout(function() {
reject('Timeout Error');
}, this._timeout);
await chain_handlers(fns, (fn, next) => {
return fn(req, res, next);
});
return;
}
}
if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') {
return;
}
//request = credentials: 'include'
fetch(event.request).then(resolve).catch(reject);
} catch(error) {
this._handle_error(resolve, req, error);
}
}));
});
And I've noticed that when the JS file is blocked by AdBlocker (uBlock) Chrome Extension I've got an error with a stack trace in dev tools:
The errors came from Analytics (OWA) that I have on my blog.
So the question is what is the purpose of reject
in a fetch
event? And how to properly handle Errors like this in service Workers to not get a stack trace?
EDIT: I've needed to put my whole code of the fetch even because got a lot of comments about async/await and Promise constructor, and it's not feasible to use one without the other in my case.
This doesn't changes the question.
EDIT2:
So I've minimized the code, this is my real question I don't care that I have anti-pattern a lot of libraries do things that you don't normally do I don't care. I just want to get the answer to this simple question:
How to don't get a stack trace and how and what is rejection in Promise for fetch event for? How to properly handle fetch rejection in a Service Worker fetch event?
This is simplified code:
self.addEventListener('fetch', (event) => {
event.respondWith(new Promise((resolve, reject) => {
fetch(event.request).then(resolve).catch(reject);
}));
});
self.addEventListener('activate', (event) => {
event.waitUntil(clients.claim());
});
And this is the console when AdBlock is on: