admin管理员组文章数量:1395329
When learning about JavaScript it remends using async
/await
as it's much more readable than .then
, and I agree. Unfortunately when it es to PWA service workers, async
seems to be forgotten.
When trying to create an install function for a service worker with async style:
const cacheVersion = "v1";
const cacheAssets = [
"/",
"/index.html",
"/static/img/logo.svg",
];
async function install(version, assets) {
const cache = await caches.open(version);
console.log("Doing stuff....");
}
self.addEventListener("install", (event) => {
console.log("Service Worker INSTALL START");
event.waitUntil(install, cacheVersion, cacheAssets); // <--- Does not call install()
console.log("Service Worker INSTALL COMPLETE");
});
The install
function is never run. If I change this line:
event.waitUntil(install, cacheVersion, cacheAssets);
to
install(cacheVersion, cacheAssets);
Then the line is run, but not waited for, causing problems.
How does one use event.waitUntil
to call an async function and wait for it?
To me event.waitUntil
is like await
, so why have this weird special function that blocks the main loop, when it seems like nothing else in JS does? Just seems so strange to me.
When learning about JavaScript it remends using async
/await
as it's much more readable than .then
, and I agree. Unfortunately when it es to PWA service workers, async
seems to be forgotten.
When trying to create an install function for a service worker with async style:
const cacheVersion = "v1";
const cacheAssets = [
"/",
"/index.html",
"/static/img/logo.svg",
];
async function install(version, assets) {
const cache = await caches.open(version);
console.log("Doing stuff....");
}
self.addEventListener("install", (event) => {
console.log("Service Worker INSTALL START");
event.waitUntil(install, cacheVersion, cacheAssets); // <--- Does not call install()
console.log("Service Worker INSTALL COMPLETE");
});
The install
function is never run. If I change this line:
event.waitUntil(install, cacheVersion, cacheAssets);
to
install(cacheVersion, cacheAssets);
Then the line is run, but not waited for, causing problems.
How does one use event.waitUntil
to call an async function and wait for it?
To me event.waitUntil
is like await
, so why have this weird special function that blocks the main loop, when it seems like nothing else in JS does? Just seems so strange to me.
-
1
Side note: I haven't played with service workers nearly enough, but I'm 99.9% sure your final
console.log
will say the worker is installed prematurely. I suggest putting that call at the end ofinstall
, rather than after thewaitUntil
call.waitUntil
just tells the event subsystem that the work is ongoing. I very much doubt it blocks the thread. (But again, I haven't played with service workers enough yet.) – T.J. Crowder Commented Jan 1, 2021 at 13:42
1 Answer
Reset to default 8install
isn't called because you don't call it. waitUntil
accepts a promise, not a function. An async
function isn't a promise, it's a function that returns a promise.
Call your function and pass the promise it returns into waitUntil
:
event.waitUntil(install(cacheVersion, cacheAssets));
// −−−−−−−−−−−−−−−−−−−−^−−−−−−−−−−−−−−−−−−−−−−−−−^
本文标签: JavaScript how to use eventwaitUntil() to wait for an async function callStack Overflow
版权声明:本文标题:JavaScript how to use event.waitUntil() to wait for an async function call - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744733633a2622192.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论