"setInterval" nie dziala tak jak powinien

0

Czesc, mam sobie dwa kodzik html:

<a  id="run_test">Run Test</a>
<div id="resultTest"></div>
<div id="console"></div>

i kod jquery/js:

setInterval(function () {
            $("#console").load('read_console/log_download');
        }, 500);
$("#run_test").click(function () {
            $("#resultTest").html("");
            $("#resultTest").load('runtest');
        });

Kod oczywiscie uproscilem, ale ogolna koncepcja wyglada tak, ze do diva 'console' ladowana jest co pol sekundy zawartosc pliku tesktowego i to dziala bardzo dobrze, jednakze gdy wcisniemy przycisk "Run Test" to setInterval przestaje dzialac dopoki nie skoncza sie operacje zaplanowane po wcisnieciu przycisku. Da sie to jakos zrobic, zeby to nie mialo wplywu na setInterval? Mam nadzieje, ze rozumiecie o co chodzi ;)

3

Nie bardzo. Javascript nie jest wielowątkowy. setInterval nie gwarantuje Ci, że po 500 ms coś się wykona. W javascript jest coś takiego jak event loop. W dużym uproszczeniu oznacza to, że jednoczesnie może się wykonywać tylko jedna rzecz. Jeżeli coś już się będzie działo, to twój setInterval trafi do kolejki i wykona się tak szybko jak szybko "zwolni się miejsce".

Tutaj masz skrypt ilustrujący co się dzieje https://jsfiddle.net/aacxok9s/2/

Polecam talka na ten temat : What the heck is the event loop anyway?

0

Niestety tego sie obawialem. Dzieki za potwierdzenie.

2

@Desu przedstawił temat bardzo pobieżnie, aktualnie chyba w każdym popularnym środowisku z JS da się temat rozwiązać albo obejść. Skupmy się na Javascripcie przeglądarkowym, bo takiego używasz:

  1. Co robi ten przycisk. Pokaż kod. Wątpię, że masz tak wiele obliczeń, że byłbyś w stanie zauważyć zatrzymanie pętli. Może wykonujesz synchroniczny request ajax i da się to łatwo poprawić?

  2. Jest jeszcze coś takiego jak WebWorkers, dostępne w każdej nowej przeglądarce (IE10, Firefox 3.5, Chrome 4, Opera 11.5, Safari 4), idealne miejsce do wykonywania ciężkich obliczeń, ciężkich zapytań ajax, gdzie trzeba parsować odpowiedź itd - główny wątek działa normalnie, zadania w WebWorkzerze wykonują się w tle, w innych wątkach.

0

Sory, ze tak pozno, ale dopiero teraz zajrzalem. Przycisk odpalal z poziomu php'a shell'owe testy (shell_exec), ktore trwaly jakis czas, wiec wszystko stalo w miejscu dopoki testy sie nie skonczyly. Rozwiazalem to tak, ze przycisk odpalal testy w tle, a nie czekal na skonczenie jak mialem na poczatku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1