webForumDet fria alternativet

setTimeout() i loop

JavaScript

4 svar · 774 visningar · startad av prplxr

Medlem sedan juni 2012581 inlägg
Frågan#1

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
	$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!?

Medlem sedan aug. 20039 340 inlägg
#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:

setTimeout(setNews(arrItem[0], arrItem[1]), delay);

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

setTimeout(
function(){setNews(arrItem[0], arrItem[1]); }
, delay);

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.

Medlem sedan juni 2012581 inlägg
#3

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

Lösningen blev följande:

<?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! :-)

Medlem sedan aug. 20039 340 inlägg
#4

Den här snutten:

        if(i==29) {
            i=0;
        } else {
            i++;
        }

kan du ersätta med

i=(i+1)%29

Procenttecknet betyder modulo, dvs divisionsrest. Med andra ord, när i+1 == 29 blir resten noll, och i tilldelas 0 igen.

Medlem sedan juni 2012581 inlägg
#5

nitro2k01 skrev:

Den här snutten:

        if(i==29) {
            i=0;
        } else {
            i++;
        }

kan du ersätta med

i=(i+1)%29

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

269 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)