<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem petla-foreach</title>
<link>https://forum.pasja-informatyki.pl/tag/petla-foreach</link>
<description>Powered by Question2Answer</description>
<item>
<title>Javascript Pętla for i setTimeout</title>
<link>https://forum.pasja-informatyki.pl/549308/javascript-petla-for-i-settimeout</link>
<description>

&lt;p&gt;Witam, uczę się JS od 3&amp;nbsp;tyg. To mój pierwszy post. Zacząłem sobie taki projekcik, gra karciana (typu MagicTheGathering)&amp;nbsp;w przeglądarce. Teraz piszę ruchy komputera i utknąłem tzn nie wiem czego użyć (również ogólnie, żeby ruchy komputera odbywały się jedna po drugiej, tak, żeby było widać, że coś faktycznie robi, a nie wszystko dzieje się na raz), żeby to przeskoczyć.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Problem polega na tym, że pętla robi kolejny obrót za czym setTimeout się skończy i usunie kartę. Co skutkuje tym, że poprzednia pętla znów działa na tej karcie (bo nie zdążyło jej usunąć),&amp;nbsp;zamiast na następnej. (bez setTimeout działa dobrze, ale usuwa ją natychmiast i transform nie działa tzn nie zdąży zadziałać)&lt;/p&gt;



&lt;pre class=&quot;brush:jscript;&quot;&gt;
// e - to div z kartą
// cała funkcja również znajduje się w pętli
function pierwszyTargetKarta(jakiDmg) {
  const wystawioneKarty = wystKartyWalka.children;
  if (wystKartyWalka.children.length &amp;lt; 1) return false;
  
  Array.from(wystawioneKarty).forEach(e =&amp;gt; {
    const hpTeraz = e.dataset.nowhp;
    
    if (jakiDmg &amp;gt;= hpTeraz &amp;amp;&amp;amp; komp.juzZaatakowales === 0) {
      komp.juzZaatakowales = 1;
      init.iloscWystawionychKart--;
      e.style.transition = &quot;transform 600ms&quot;;
      e.style.transform = &quot;translate(0px, 300px)&quot;;
      setTimeout(() =&amp;gt; {
        e.remove();
      }, 700);
    }
  }); 
}&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&amp;nbsp;Próbowałem to zamknąć w funkcji asynchronicznej, ale właściwie robi to samo.&lt;/p&gt;



&lt;pre class=&quot;brush:jscript;&quot;&gt;
function pierwszyTargetKarta(jakiDmg) {
  const wystawioneKarty = wystKartyWalka.children;
  if (wystKartyWalka.children.length &amp;lt; 1) return false;
  
  Array.from(wystawioneKarty).forEach(e =&amp;gt; {
    const hpTeraz = e.dataset.nowhp;
    
    (async () =&amp;gt; {
      if (jakiDmg &amp;gt;= hpTeraz &amp;amp;&amp;amp; komp.juzZaatakowales === 0) {
        komp.juzZaatakowales = 1;
        init.iloscWystawionychKart--;
        e.style.transition = &quot;transform 600ms&quot;;
        e.style.transform = &quot;translate(0px, 300px)&quot;;
        const usun = await usuwanieKarty(e);
      }
    })();
  }); 
}
function usuwanieKarty(e) {
  return new Promise(resolve =&amp;gt; {
    setTimeout(() =&amp;gt; {
      e.remove();
      console.log(&quot;usunalem&quot;)
      resolve('usunalem');
    }, 700);
  });
}&lt;/pre&gt;



&lt;p&gt;Może mnie ktoś naprowadzić czego użyć, ewentualnie jak to ugryźć. I co mogę używać do synchronizacji ruchów komputera (w sumie opóźnienia funkcji), czy async to dobry pomysł.&lt;/p&gt;



&lt;p&gt;Mam nadzieje, że opisałem to w miarę zrozumiale.&lt;/p&gt;



&lt;p&gt;Dzięki.&lt;/p&gt;



&lt;p&gt;@edit&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Wdrążyłem w życie wasze propozycje i z async function sleep działa przy pierwszym okrążeniu, jak jest więcej elementów to po prostu znikają.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Żeby to bardziej z wizualizować problem&amp;nbsp;skróciłem do minimum kod i wrzuciłem na jsfiddle:&lt;/p&gt;



&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://jsfiddle.net/pLyhdn8r/&quot;&gt;https://jsfiddle.net/pLyhdn8r/&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>JavaScript</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/549308/javascript-petla-for-i-settimeout</guid>
<pubDate>Wed, 18 Aug 2021 14:00:59 +0000</pubDate>
</item>
<item>
<title>JavaScript - sumowanie i mnożenie kolejnych elementów tablicy</title>
<link>https://forum.pasja-informatyki.pl/313043/javascript-sumowanie-i-mnozenie-kolejnych-elementow-tablicy</link>
<description>Cześć! Problem pewnie banalny, ale dla mnie temat jest całkowicie nowy i stanęłam przed ścianą. &lt;br /&gt;
&lt;br /&gt;
Tworzę tablicę &amp;nbsp;var liczby = [1,2,3,4,5,6] &lt;br /&gt;
&lt;br /&gt;
I za pomocą funkcji forEeach powinnam osiągnąć efekt, jak po wyrzuceniu:&lt;br /&gt;
&lt;br /&gt;
console.log(liczba[0]*liczba[1]+liczba[0]+liczba[1]);&lt;br /&gt;
&lt;br /&gt;
Pewnie jest to bardzo proste, ale jako śweżynka nie mogę tego rozgryźć :/</description>
<category>JavaScript</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/313043/javascript-sumowanie-i-mnozenie-kolejnych-elementow-tablicy</guid>
<pubDate>Sat, 23 Dec 2017 17:33:44 +0000</pubDate>
</item>
</channel>
</rss>