Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Spójność wykonywania kodu JS
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Akcelerator
Witam.

Zastanawiam sie co dzieje sie z wykonywanym kodem JS, gdy ktoś zamyka przeglądarkę, lub przechodzi na kolejną stronę. Czy cały kod którego wykonywanie się zaczęło zostaje przeprowadzone do końca ? Zapewne jest wykonywane w całości bo inaczej mogło by to prowadzić to nieoczekiwanych sytuacji, ale lepiej się upewnić. Trochę o tym szukałem ale ciężko coś znaleźć. Pewnie w opisie standardów ale to łato znaleźć nie będzie.

Dziękuje.
kamil4u
Cytat
Czy cały kod którego wykonywanie się zaczęło zostaje przeprowadzone do końca ?

Nie.

Choć to są tylko moje przypuszczenia w tym względzie. Kod JS wykonywany jest na komputerze użytkownika, producenci przeglądarki ustalają, że jeżeli użytkownik zamyka stronę, to zamykane są procesy odpowiedzialne za wykonywanie kodu - bo i po co mają być podtrzymywane? Dodatkowo, jeżeli zrobisz test i w AJAX-sie ustalisz, żeby po 10s wysłał zapytanie do serwera, ale przez te 10s zamkniesz stronę to odpowiedź do serwera nie dotrze( sprawdź sam i napisz czy na pewno ).

A po co Ci taka wiedza? Może jak opiszesz problem dokładniej znajdziemy jakiś wspólne rozwiązanie. O jakich "nieoczekiwanych" sytuacjach piszesz.
Mephistofeles
Nie. Jak wysyłasz maila na Gmailu, albo wiadomość na Facebooku i zamkniesz kartę przed wysłaniem to wiadomość nie dotrze, ale da się to przechwycić - tak robi i Gmail i Facebook, wyświetlają ostrzeżenie.
Akcelerator
Ale to nie chodzi o zdarzenie które ma się wykonać za dziesięć sekund ustawione w timeże czy wywołane zdarzeniem ajaxsa. Chodzi o to czy jak owe zdarzenie zacznie się wykonywać, czy wykonywać się skończy w całości czy powiedzmy na 100 przebiegów pętli pójdzie 50 ? Bo to zupełnie co innego. Po prostu czysty kod zacznie się wykonywać instrukcja po instrukcji, czy jest jakaś gwarancja (z wyjątkiem sytuacji ekstremalnych w rodzaju zawieszenie systemu) że zostanie wykonany do końca ?
darko
Wydaje się, że to zależy tylko od przeglądarki i jej interpretera javascript.
kamil4u
A pytasz tylko z ciekawości czy masz jakiś konkretny powód? Nie znam odpowiedzi na Twoje pytanie, a jedyna osoba, którą znam, która możliwe, że zna odpowiedź na to pytanie to ~kuku z www.forum.webhelp.pl . Zapytaj tam to jest szansa, że się dowiesz smile.gif
Crozin
[JAVASCRIPT] pobierz, plaintext
  1. for (var i = 0; i < 1000; i++) {
  2. // do sth
  3. }
[JAVASCRIPT] pobierz, plaintext
Pytasz o to czy jeżeli w momencie gdy ta pętla jest w połowie swojego wykonywania się (i = 500), a użytkownik zamknie przeglądarkę/kartę ze stroną to czy kod się wykona do końca (do i = 1000)? Nie, nie zostanie.
kamil4u
Skąd wiesz? Wydaje Ci się, jakoś sprawdziłeś samemu( jak? ) czy jest w jakieś dokumentacji?

W sumie jak dla mnie trochę zbędna informacja szczególnie jeśli chodzi o praktykę, ale zawsze dodatkowa wiedza to plus, a poza tym lubię dużo wiedzieć smile.gif
Crozin
Cytat
Skąd wiesz? Wydaje Ci się, jakoś sprawdziłeś samemu( jak? ) czy jest w jakieś dokumentacji?
1. Na logikę. Po co miałoby się to dalej wykonywać?
2. Przeglądarka bardzo szybko zaczęłaby Ci zżerać gigabajty pamięci - masa stron, ma skrypt JS, które działają w nieskończonej pętli.
3. Prosty test: niech co 10 sekund przeglądarka generuje 10 MiB danych. Odpal go, patrz na zużycie pamięci, wyłącz przeglądarkę i sprawdź co się dzieje dalej.

EDIT: Przykład testu na żywo: http://jsfiddle.net/G7pdG/1/ - powinien co sekundę generować kolejne ~40 MiB danych przez 15 sekund.
markonix
To takie same pytanie jak czy pętla nieskończona w PHP będzie się wykonywać po wyłączeniu serwera (apache)?
Podmiotem wykonawczym kodu JS jest przeglądarka, z tego co zauważyłem ostatnio staje się modne rozkładanie działania przeglądarki na więcej niż jeden proces ale głównie to odnosi się do pluginów, o oddzielnym działaniu JS nie słyszałem.
Akcelerator
Nie robi się nieskończonych pętli bo zawiesza to przeglądarkę, która po chwili działania przerywa skrypt. Przeglądarka oferuje możliwość rejestracji zdarzeni zamknięcia, to jakim cudem kod w tym zdarzeniu miał by sie wykonać skoro interpreter przerywał by prace ? A potrzebne mi to aby operacja na ciasteczkach jeśli się zacznie, to żeby została przeprowadzona do końca. Chce mieć pewność że nie pozostawi jakichś niespójności.
Crozin
1. Wykonuje się nieskończone pętle i to bardzo, bardzo często. Nie ma powodu by zawiesiły pracę przeglądarki.
2. Zdarzenia typu onUnload wykonują się przed zamknięciem karty (zabiciem procesu).
3. By zachować spójność danych możesz zrobić bardzo prosty trik. Nie nadpisuj danych, tylko utwórz ich drugą wersję. Dodatkowo dodaj kolejne ciasteczko, które będzie wskazywało, która wersja powinna być odczytana. Wartość tego ostatniego ciasteczka zmieniaj dopiero w momencie, gdy posiadasz już komplet zapisanych danych.
Akcelerator
Fajnie że przed, co że nie zmienia faktu ze aby to miało sens musi czekać na wykonanie, bo jasnowidzem nie jest i nie uruchamia skryptu zanim naciśniesz zamknij. Raczej wątpię by kawałek kodu w tym zdarzeniu był specjalnie uprzywilejowany. A tu masz prosty test co do nieskończonej pętli, zobacz co sie dzieje z przeglądarką i procesorem.
[JAVASCRIPT] pobierz, plaintext
  1. while (true) {}
[JAVASCRIPT] pobierz, plaintext
Crozin
W momencie gdy klikasz "zamknij" wywoływane jest zdarzenie (np. onunload czy onbeforeunload), wykonywany jest kod JS, a po jego wykonaniu następuje faktyczne zamknięcie karty.
Cytat
A tu masz prosty test co do nieskończonej pętli, zobacz co sie dzieje z przeglądarką i procesorem. [...]
A tu kolejny przykład pętli nieskończonej:
[JAVASCRIPT] pobierz, plaintext
  1. window.setInterval(function() {
  2. // nie zajedzie Ci to procesora, przeglądarka tego nie przerwie
  3. }, 2e3);
[JAVASCRIPT] pobierz, plaintext
Jak widzisz pętle nieskończone mogą mieć różną formę. A jeżeli w ramach pętli próbujesz zajechać komputer, to oczywiste, że przeglądarka postara się temu zapobiec.
Akcelerator
Tak to też można tak określić, ale to o czym mówimy nie ma takiej postać. Zresztą oczywiste że skoro nie nastąpi kolejne zdarzenie kod nie zostanie wykonany. Chodzi oto że jak zacznie wykonywać się to twoje ciało pętli, to czy ma gwarancje całkowitego wykonania.
rzymek01
Oczywiste jest, że nie wykonuje się do końca, nie ma żadnej gwarancji, a wręcz jestem przekonany, że masz gwarancję przerwania wykonywania kodu,
zrób tak jak napisał Crozin, jest to bardzo popularna praktyka,
czyli:
1. tworzysz zmienną np. isProgress=true
2. wykonujesz operacje, co do których nie masz pewności wykonania
3. isProgress=false

jeśli isProgress == false, to wiesz, że kod został wykonany do końca, w przeciwnym razie uje*ucięło kod w trakcie wykonywania...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.