2016-06-18 29 views
13

MDN sugeruje, że należy wykonać następujące czynności, aby utworzyć i zapełnić pamięć podręczną Pracownik serwisu:Co robi event.waitUntil zrobić w serwisie service worker i dlaczego jest potrzebny?

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

Nie rozumiem tego kodu. Metoda waitUntil dokumentuje też, i wydaje się, że powyższy kod jest jedynym celem istnienia jest to w tej chwili:

metoda ExtendableEvent.waitUntil() przedłuża żywotność przypadku . Po wywołaniu zdarzenia EventHandler powiązanego ze zdarzeniem instalacyjnym opóźnia traktowanie instalującego pracownika jako zainstalowanego do momentu pomyślnego zakończenia obietnicy. Jest to przede wszystkim używane w celu zapewnienia, że ​​pracownik serwisowy nie jest uważany za zainstalowany, dopóki nie zostanie wypełniony cały rdzeń buforowany.

Co ja nie rozumiem:

  • Jak waitUntil ogólnie wpływa przepływ kodu? Czy powstrzymuje wydarzenie od propagacji, dopóki nie ustąpi obietnica?
  • Dlaczego jest to potrzebne w kontekście otwierania pamięci podręcznej pracownika?

Zadaję to pytanie, ponieważ mam problem z powyższym kodem i chciałbym go zrozumieć.

Odpowiedz

16

Zgodnie z opisem, the ExtendableEvent.waitUntil() method extends the lifetime of the event. Jeśli nie wywołasz tego w ramach metody, pracownik serwisowy może zostać zatrzymany w dowolnym momencie (patrz the specification).

Metoda służy do informowania przeglądarki, aby nie kończyła pracy pracownika serwisowego, dopóki obietnica przekazana pod numer waitUntil nie zostanie rozwiązana lub odrzucona.

O konkretnych pytań:

  • W przypadku install i wydarzeń activate, opóźnia przełącznik stan pracownika serwisu do installed i activated (patrz specification of the waitUntil method, zwłaszcza ostatniej części akapit).
  • Myślę, że reszta mojej odpowiedzi już odpowiedziała, dlaczego jest potrzebna.
+0

Nadal nie rozumiem. Jeśli usunę plik 'event.waitUntil', co się stanie? Próbowałem usunąć 'event.waitUntil', nadal działa dobrze. Pamięć podręczna miała buforowany zasób i stronę można było odwiedzić w trybie offline. Jeśli potrzebujesz Demo, mogę Ci je przesłać. – youngwind

+0

Jeśli go nie nazwiesz, pracownik serwisu może zostać zatrzymany w dowolnym momencie. Nie oznacza to, że zostanie zatrzymany, więc w niektórych przypadkach może działać, aw niektórych przypadkach (w zależności od czasu) nie zadziała. – Marco

+0

Tak, znalazłem to, co powiedziałeś w oficjalnym dokumencie. Co chcę wiedzieć to: 1. Jak wywołać przypadki "niedziałające"? 2. Dlaczego pracownik serwisowy może zostać zatrzymany, jeśli go nie nazywam? Kluczową kwestią jest: dlaczego, nie co. Nie mogę znaleźć odpowiedzi w dokumencie. – youngwind