Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Spójność wykonywania kodu JS
Akcelerator
post 9.06.2012, 21:44:17
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 16.02.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kamil4u
post 9.06.2012, 21:54:04
Post #2





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
Mephistofeles
post 9.06.2012, 22:09:37
Post #3





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Akcelerator
post 9.06.2012, 22:18:05
Post #4





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 16.02.2011

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował Akcelerator 9.06.2012, 22:19:54
Go to the top of the page
+Quote Post
darko
post 10.06.2012, 01:06:53
Post #5





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Wydaje się, że to zależy tylko od przeglądarki i jej interpretera javascript.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
kamil4u
post 10.06.2012, 14:34:52
Post #6





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
Crozin
post 10.06.2012, 14:43:24
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


[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.
Go to the top of the page
+Quote Post
kamil4u
post 10.06.2012, 14:47:14
Post #8





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
Crozin
post 10.06.2012, 15:20:48
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Crozin 10.06.2012, 15:26:28
Go to the top of the page
+Quote Post
markonix
post 10.06.2012, 15:29:25
Post #10





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
Akcelerator
post 11.06.2012, 21:03:12
Post #11





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 16.02.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Crozin
post 11.06.2012, 21:13:41
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Akcelerator
post 11.06.2012, 21:34:54
Post #13





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 16.02.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Crozin
post 11.06.2012, 21:42:51
Post #14





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Akcelerator
post 11.06.2012, 22:02:27
Post #15





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 16.02.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Akcelerator 12.06.2012, 13:34:14
Go to the top of the page
+Quote Post
rzymek01
post 12.06.2012, 22:58:02
Post #16





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

Ostrzeżenie: (0%)
-----


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...


--------------------
:]
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 3.05.2024 - 17:15