Spójność wykonywania kodu JS |
Spójność wykonywania kodu JS |
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. |
|
|
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. -------------------- |
|
|
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.
|
|
|
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 |
|
|
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.
|
|
|
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
-------------------- |
|
|
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%) |
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. |
|
|
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ć -------------------- |
|
|
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 |
|
|
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. -------------------- |
|
|
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.
|
|
|
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. |
|
|
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.
|
|
|
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: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. |
|
|
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 |
|
|
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 -------------------- :]
|
|
|
Wersja Lo-Fi | Aktualny czas: 3.05.2024 - 17:15 |