Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Po stronie przeglądarki _ [Js] czekanie az petla sie skonczy

Napisany przez: blokern 2.03.2021, 17:21:38

Hejka mam taki kod

  1. $(document).ready(function(){
  2. $(".filtr").click(function(){
  3. //$(".preloader").css("display", "block");
  4. var data = $(this).attr("name");
  5. $(this).addClass("check");
  6. apartamenty.forEach(
  7. function(id) {
  8. var kalendarz = $("div[name="+id+"]").attr(data);
  9. if($("div[name="+id+"]").is(':visible'))
  10. {
  11. if(kalendarz==0){
  12. $("div[name="+id+"]").hide();
  13. }
  14. }else{
  15. $("div[name="+id+"]").show();
  16. }
  17. });
  18. });
  19. });


dlaczego to
  1. $(this).addClass("check");

wykonuje sie dopiero jak skonczy wykonywac sie to
  1. apartamenty.forEach


i jak moge spowodowac zeby addClass nie czekal na koniec petli?

Napisany przez: LowiczakPL 2.03.2021, 19:39:13

Na pewno wykonuje się od razu jak klikasz w filtr, nie czeka na koniec pętli o którym piszesz.
Ta linia kodu wykonuje się zanim pętla się zacznie wykonywać.

Napisany przez: blokern 2.03.2021, 20:14:09

Jednak jest inaczej i wynik w przeglądarce widzę dopiero po wykonaniu tej pętli.czytalem o asynchronicznym ladowaniu się kodu, że może tutaj leży problem. Console.log kiedy dam w tym samym miejscu co linijka z addclass wyświetla tekst który sobie wpisze ale z akcjami typu DOM chyba jest inaczej? Mądrze się a nie wiem ale tak czy siak nie wykonuje się jedno po drugim tylko czeka skrypt aż skończy mielić fotelach w funkcji
$(".filtr").click(function()

Napisany przez: trueblue 3.03.2021, 07:33:01

A co się dzieje po usunięciu pętli?
Ile jest elementów apartamenty i gdzie inicjujesz tą zmienną?

Napisany przez: blokern 3.03.2021, 11:28:47

jak usune petle to leci z wykonywaniem po kolei. wlasciwie to nie widac przez chwile preloader bo jest show i hide po sobie
210 apartamentow

a jeszcze mam pytanie o to
apartamenty.forEach(function(id) {})

wyswietli jak skonczy sie petla a czy da sie wyswietlac w trakcie wykonywania petli?

Napisany przez: trueblue 3.03.2021, 11:46:50

Spróbuj owinąć pętlę w:

  1. setTimeout(function(){
  2.  
  3. ...pętla
  4.  
  5. }, 10);

Napisany przez: LowiczakPL 7.03.2021, 07:41:44

Cytat(blokern @ 3.03.2021, 11:28:47 ) *
jak usune petle to leci z wykonywaniem po kolei. wlasciwie to nie widac przez chwile preloader bo jest show i hide po sobie
210 apartamentow

a jeszcze mam pytanie o to
apartamenty.forEach(function(id) {})

wyswietli jak skonczy sie petla a czy da sie wyswietlac w trakcie wykonywania pętli?


ten kod nie jest napisany tak aby czekał jak skończy się pętla, ten kod modyfikuje DOM w każdym przebiegu pętli, dzieje się to po prostu tak szybko że nie zauważasz tego, aby to sprawdzić wystarczy dać pauzę KILKA sekund opóźnienia na końcu pętli (nie znaczy to poza pętla ale przed jej zakończeniem) a przekonasz się że tek kod przed pętlą o który pytałeś wcześniej wykonuje się najpierw i że każda linia wykonuje się na stronie jedna po drugiej nie czekając na koniec pętli.

funkcja opóźniająca

Kod
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}


użycie funkcji aby opóźniać wykonywanie pętli w mili sekundach, 1 sekunda to 1000 mili sekund, poniżej to 2 sekundy

Kod
await sleep(2000);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)