web-dev-qa-db-fra.com

Que fait event.waitUntil dans le service worker et pourquoi est-il nécessaire?

MDN vous suggère de faire ce qui suit pour créer et remplir le cache de l'agent de service:

this.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open('v1').then(function(cache) {
      return cache.addAll([
        '/sw-test/',
        '/sw-test/index.html',
        ... etc ...
      ]);
    })
  );
});

Je ne comprends pas ce code. La méthode waitUntil est également documentée, et il semble que le code ci-dessus soit le seul but de son existence à l'heure actuelle:

La méthode ExtendableEvent.waitUntil () étend la durée de vie de l'événement. Lorsqu'il est appelé dans un EventHandler associé à l'événement d'installation, il retarde le traitement du travailleur d'installation comme installé jusqu'à ce que la promesse passée se résolve avec succès. Ceci est principalement utilisé pour garantir qu'un technicien de service n'est pas considéré comme installé jusqu'à ce que tous les caches principaux dont il dépend soient remplis.

Ce que je ne comprends pas, c'est:

  • Comment waitUntil affecte-t-il généralement le flux de code? Est-ce que cela empêche l'événement de se propager jusqu'à ce que sa promesse soit résolue?
  • Pourquoi est-il nécessaire dans le contexte de l'ouverture du cache de travail?

Je pose cette question car j'ai des problèmes avec le code ci-dessus et je voudrais le comprendre.

38
Tomáš Zato

Comme le dit la description, the ExtendableEvent.waitUntil() method extends the lifetime of the event. Si vous ne l'appelez pas dans une méthode, le service worker peut être arrêté à tout moment (voir la spécification ).

Ainsi, la méthode waitUntil est utilisée pour dire au navigateur de ne pas terminer le service worker tant que la promesse passée à waitUntil n'est pas résolue ou rejetée.

A propos de vos questions spécifiques:

  • Dans le cas des événements install et activate, il retarde le changement d'état du technicien de service sur installed et activated (voir spécification de la méthode waitUntil , en particulier la dernière partie du paragraphe).
  • Je pense que le reste de ma réponse a déjà répondu aux raisons pour lesquelles cela est nécessaire.
36
Marco