3

async/await構文を使用している間、私はサービスワーカーの約束に苦しんでいます。
状況:私はプッシュ通知を受け取り、クリックイベントを処理したい。もし私がthencatchで "古い"構文を使用すると、クライアントのリストに対してiteratoreを実行して何かを行うことができます。 async/awaitと私の好みの方法を使用すれば、何もしません。 @Criceと@Keithへサービスワーカー:waituntilとの組み合わせで非同期待機が正しく動作していません

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); 
    }); 
}); 
+0

'waitUntil'のように見えるのは、関数ではなく、関数であるためです。非同期関数をすぐに呼び出すと、うまくいくかもしれません。 'event.waitUntil((async()=> {...})())' – CRice

+0

@CRiceは正しいです。ここに関数を渡すのは約束ではありません。あなたはIIFのやり方をすることができますが、もっと分かりやすい方法は、あなたの非同期のものをすべて持っている 'getClients'という関数を作り、' event.waitUntil(getClients()); ' – Keith

+0

@CRiceと@Keith ありがとうございました。あなたはまったく正しい。私はいくつかのものを混ぜた... 私はそれが約束を返すことを知っていたので、私はまた、 "外部"非同期関数を使用しようとしました。しかし、実際には私はそれを呼び出す代わりに参照を渡しただけです( 'waitUntil(getClients)' vs 'waitUntil(getClients())' – dkirchhof

答えて

1

おかげで、

WaitUntilにより、代わりに、関数の引数として約束を必要とします。これはasync/awaitスタイルの実際の例です:

self.addEventListener("notificationclick", event => 
{ 
    event.waitUntil(getClients()); 
}); 

async function getClients() 
{ 
    const clientList = await self.clients.matchAll(); 
    console.log(clientList); 
} 
+0

あなたの例(Q)とこれの違いは何ですか?あなたが非同期関数を両方に渡しているように見えます。だから、約束事と約束事は何ですか?これはうまくいくでしょう:event.waitUntil((async()=> {/ * code * /}())); – REJH

+1

実際には、質問の私の例ではiifeを使用しませんでした。つまり、カッコを忘れてしまったので、関数は返されましたが、約束は返されませんでした。 'let a =(async()=> 対 'let b = async()=> {返すPromise.resolve()})();返信Promise.resolve()})(); コンソールのログは、 )}; コンソール.log(typeof b、b instanceof Promise); // function false' 私の答えは、私も約束を返すasync関数を呼び出します。私は関数を 'event.waitUntil'関数にparamとして渡す前に(やはり括弧を忘れてしまいました)。 – dkirchhof

関連する問題