![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 9.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
Czy w javascript jest jakiś prosty mechanizm synchronizacji, tudzież sposób, żeby uzyskać taki efekt.
Klasyczna sytuacja. Dwie funkcje, obie operują na tych samych zasobach. Jedna jest cykliczna np co 5 s. Trwa około 1s. Druga związana z eventem. Funkcja pierwsza ma w swojej treści czekanie setTimeout. Jeśli kliknę w trakcie czekania niestety nie uzyskam żądanego efektu ponieważ na jednym zasobie pracują dwie funkcje. Rozwiązaniem byłoby synchronizacja między nimi w ten sposób, że druga funkcja czeka na zakończenie pierwszej i wtedy się wykonuje, natomiast kolejne wywołanie funkcji pierwszej nastąpi dopiero po wykonaniu funkcji drugiej. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
JS jest w pełni jednowątkowy (pomijając Web workery), stąd brak w tym języku jakichkolwiek mechanizmów synchronizacji. Jednak konieczność zsynchronizowania kilku różnych timeoutów wydaje się dosyć podejrzana - mógłbyś opisać swój problem i napisać dlaczego właśnie tak chcesz go rozwiązać? Wygląda na to, że mamy tutaj do czynienia z problemem XY.
Co do samego tematu - prawdopodobnie najłatwiej byłoby utworzyć jakąś kolejkę, gdzie co 5 sekund dodawałbyś pierwszą funkcję, a przy kliknięciu drugą. Samo wykonywanie funkcji z tej kolejki leżałoby w gestii innego obiektu, który mógłby wstrzymywać jej działanie do czasu zakończenia aktualnie przetwarzanej funkcji (łącznie z timeoutami wygenerowanymi w niej). |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 9.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
No niby jednowątkowy, ale jakoś funkcje nie czekają na siebie aż jedna się skończy i zacznie druga. Np. jak mam animację w jQuery i instrukcję za to odpowiadającą. To następna instrukcja zaczyna się wykonywać zanim skończy się animacja...
edit: może to problem XY, ale już tak daleko w to zabrnąłem... Nie będę przedstawiał problemu, bo jest rozbudowany, a wiem, jak się czyta cudzy kod. Ten post edytował Kozo_WSP 1.10.2012, 18:38:12 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat może to problem XY, ale już tak daleko w to zabrnąłem... Nie będę przedstawiał problemu, bo jest rozbudowany, a wiem, jak się czyta cudzy kod. Jak jest chociaż w miarę dobrze napisany to się czyta normalnie. Jeżeli nam nie podasz żadnych istotnych informacji ciężko nam odpowiedzieć na cokolwiek. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 9.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
Ok, ostrzegam, że to może być szok, bo to mój pierwszy skrypt w js. Także optymalizacyjnie to może być skandal, ale działa to dopóki nie trzeba zmienić slajdu klikając.
Oto slideshow mojego autorstwa:
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nie analizowałem kodu jakoś specjalnie, więc popraw mnie jeżeli gdzieś jest błąd.
Posiadasz galerię zdjęć, gdzie co 5 sekund ma pojawić się następne zdjęcie. Istnieje jednak możliwość kliknięcia w jakąś miniaturkę/przycisk "dalej" by ręcznie zmienić zdjęcie. Problem jest w tym, że jeżeli w 4 sekundy po samoczynnym zmienieniu się zdjęcia kliknę na następne, już po sekundzie samoczynnie zmienia się ono na kolejne. - Czy ten opis jest poprawny? 1. Powinieneś utworzyć sobie jedną funkcję, która będzie przyjmować jeden argument, tj. zdjęcie do wyświetlenia. Ta funkcja powinna zostać pośrednio wywołana zarówno przez automat (co 5 sekund) jak i przez użytkownika (przy kliknięciu). Pośrednio, czyli jako callback dla setInterval i $.click(); użyjesz innych funkcji, które będą ją wywoływać. 2. setInterval zwraca uchwyt do interwału. Uchwyt ten powinieneś zapisać w jakiejś zmiennej, która będzie ogólnodostępna. W funkcji wywoływanej przy kliknięciu użytkownika zatrzymasz ten interwał (clearInterval) oraz ustawisz go na nowo (ponownie setInterval). Dzięki temu, po kliknięciu zawsze trzeba będzie odczekać 5 sekund na samoczynną zmianę. Jeżeli coś jest nie tak, wrzuć kod online (np. na jsfiddle.net). Ten post edytował Crozin 1.10.2012, 19:49:38 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 9.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za odpowiedź, była bardzo pomocna. Jednak nawet jeśli zastosuje to dla mojego algorytmu, to niestety mam dalej problemy. Dlatego będę chyba musiał go zmienić. Możesz wyjaśnić jak zmieniać obrazki inaczej niż za pomocą attr("src", nowaWartość) ?
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 324 Pomógł: 110 Dołączył: 18.09.2012 Ostrzeżenie: (0%) ![]() ![]() |
Możesz wczytywać wszystkie obrazki z odpowiednim z-index albo wykorzystać parametr opacity lub oczywiście display: none;. Jest to dużo lepsze niż zamiana atrybutu src
![]() |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 9.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
Mam nadzieję, że nie sprawie kłopotu, jeśli spytam o jeszcze jedną rzecz. Co zrobić, żeby funkcja wykonała się do końca, nawet jeśli nastąpi zdarzenie click podczas jej wykonywania?
Inaczej: Funkcja dokonuje jakichś zmian po kliknięciu. JEśli kliknę kilka razy szybko, to tamte funkcje nie zdążają się wykonać w całości, są przerywane w połowie wykonania, a tego nie chcę. Chcę, żeby jak kliknę dziesięć razy to żeby funkcje wykonały się dziesięć razy od początku do końca. Niestety kolejki jquery nie są rozwiązaniem bo działają tylko dla animacji. Mogę wymusić żeby za pomocą funkcji queue( funkcja ) animacje wykonywały się w całości, jednak to już nie działa dla funkcji, które dokonują operacji Ten post edytował Kozo_WSP 5.10.2012, 23:45:59 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 23:19 |