setTimeout() i loop

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • prplxr
    Medlem
    • 2012-06-16
    • 557

    #1

    setTimeout() i loop

    Argh. Får hjärnblödning på detta. Hämtar Aftonbladets RSS med PHP för att sedan skicka den vidare till JavaScript för att där hantera den. Allt är frid och fröjd fram till den punkten att jag vill visa varje "objekt" i tre sekunder.

    Detta är koden jag har nu:

    PHP Code:
    <?php
        $rss = simplexml_load_file('http://www.aftonbladet.se/nyheter/rss.xml');
        if($rss) {
            $strItems = '';
            $items = $rss -> channel -> item;
            foreach($items as $item) {
                $strItems .= $item->link.'|'.$item->title.'@';
            }
            $strItems = substr($strItems, 0, strlen($strItems)-1);
            $arrItems = explode('@', $strItems);
        }
    ?>
    <script type="text/javascript">
        function setNews(url, title) {
            document.getElementById('newsHere').innerHTML = '<a href=\''+url+'\'>'+title+'</a>';
        };
        var arrItems = <?php echo json_encode($arrItems); ?>;
        var run = 0;
        for(var i=0, item; item=arrItems[i]; i++) {
            var arrItem = arrItems[i].split('|');
            if(run == 0) {
                run = 1;
                delay = 0;
            } else {
                delay = 3000;
            };
            setTimeout(setNews(arrItem[0], arrItem[1]), delay);
            if(i==29) i=0;
        };
    </script>
    Är jag helt ute och cyklar, eller!?
    Avundas aldrig någon det sken av lycka han har för du känner inte hans hemliga sorger.
  • nitro2k01
    Forumvärd
    • 2003-08-26
    • 7630

    #2
    setTimeout schemalägger att funktionen du anger ska köras x sekunder in i framtiden. Med andra ord, den fungerar inte som en "sleep"-funktion. Men ett mer akut problem med din kod är anropet till funktionen:
    [kod]setTimeout(setNews(arrItem[0], arrItem[1]), delay);[/kod]Vad den koden gör är att köra setNews(arrItem[0], arrItem[1]) och sedan ta (eventuellt) returvärde och skicka till setTimeout. Du måste jobba runt det på något vis, t ex
    [kod]setTimeout(
    function(){setNews(arrItem[0], arrItem[1]); }
    , delay); [/kod]Dock skulle jag hellre omorganisera hela koden och ha en funktion som visar nästa nyhet, och sedan låta den anropa setTimeout med sig själv som argument i slutet.
    Gameboy Genius - Foto: Gatukonst och elektronikporr
    Internklippning:
    1) Snaggning av fångar.
    2) Klippning frisörer emellan.

    Comment

    • prplxr
      Medlem
      • 2012-06-16
      • 557

      #3
      Du har så rätt, så! Ibland blir det bara kaos i mössparkeringen!

      Lösningen blev följande:

      PHP Code:
      <?php
          $rss = simplexml_load_file('http://www.aftonbladet.se/nyheter/rss.xml');
          if($rss) {
              $strItems = '';
              $items = $rss -> channel -> item;
              foreach($items as $item) {
                  $strItems .= $item->link.'|'.$item->title.'@';
              }
              $strItems = substr($strItems, 0, strlen($strItems)-1);
              $arrItems = explode('@', $strItems);
          }
      ?>
      <script type="text/javascript">
          
          var arrItems = <?php echo json_encode($arrItems); ?>;
          
          function setNews(url, title) {
              document.getElementById('newsHere').innerHTML = '<a href=\''+url+'\'>'+title+'</a>';
          };
          
          function getNews(i) {
              var arrItem = arrItems[i].split('|');
              setNews(arrItem[0], arrItem[1]);
              if(i==29) {
                  i=0;
              } else {
                  i++;
              }
              setTimeout(function() {getNews(i)}, 3000);
          };
      </script>
      Tack för knuffen i rätt riktning! :-)
      Avundas aldrig någon det sken av lycka han har för du känner inte hans hemliga sorger.

      Comment

      • nitro2k01
        Forumvärd
        • 2003-08-26
        • 7630

        #4
        Den här snutten:[kod] if(i==29) {
        i=0;
        } else {
        i++;
        }[/kod]kan du ersätta med[kod]i=(i+1)%29[/kod]
        Procenttecknet betyder modulo, dvs divisionsrest. Med andra ord, när i+1 == 29 blir resten noll, och i tilldelas 0 igen.
        Gameboy Genius - Foto: Gatukonst och elektronikporr
        Internklippning:
        1) Snaggning av fångar.
        2) Klippning frisörer emellan.

        Comment

        • prplxr
          Medlem
          • 2012-06-16
          • 557

          #5
          Originally posted by nitro2k01
          Den här snutten:[kod] if(i==29) {
          i=0;
          } else {
          i++;
          }[/kod]kan du ersätta med[kod]i=(i+1)%29[/kod]
          Procenttecknet betyder modulo, dvs divisionsrest. Med andra ord, när i+1 == 29 blir resten noll, och i tilldelas 0 igen.
          Jag kände till vad % gjorde, men jag har aldrig tänkt på det sätt du beskrev här! Tusen tack! :-D
          Avundas aldrig någon det sken av lycka han har för du känner inte hans hemliga sorger.

          Comment

          Working...