【发布时间】:2017-11-15 23:30:39
【问题描述】:
在使用async/await 语法时,我在服务工作者中与承诺作斗争。
以下情况:我收到了推送通知并想处理点击事件。如果我使用带有then 和catch 的“旧”语法,我可以遍历客户端列表并对其进行处理。如果我对async/await 使用我喜欢的方式,它不会做任何事情。
self.addEventListener("notificationclick", event => {
// is working
event.waitUntil(self.clients.matchAll().then(clientList => {
console.log(clientList);
}));
// is not working
event.waitUntil(async () => {
const clientList = await self.clients.matchAll();
console.log(clientList);
});
});
【问题讨论】:
-
看起来
waitUntil接受了一个承诺,因为它是一个参数,而不是一个函数。也许如果您立即调用异步函数,它会起作用。例如:event.waitUntil( (async () => { ... })() ) -
@CRice 是正确的,你在这里传递一个函数不是一个承诺。你可以使用 IIF 方式,但我想说一个更明显更容易理解的方式是创建一个名为
getClients的函数,它包含你所有的异步内容,然后执行event.waitUntil(getClients()); -
@CRice 和@Keith 谢谢你们俩。你完全正确。我混淆了一些东西......我还尝试使用“外部”异步函数,因为我知道它会返回一个承诺。但实际上我只是传递了它的引用而不是调用它(
waitUntil(getClients)vswaitUntil(getClients())
标签: javascript push-notification async-await service-worker service-worker-events