---
title: "setTimeout() i loop"
type: "forum-thread"
url: "https://www.webforum.nu/amne/javascript/191228-settimeout-i-loop"
topic: "JavaScript"
topic_url: "https://www.webforum.nu/amne/javascript"
author: "prplxr"
published: "2013-03-18T13:22:10.000Z"
updated: "2013-03-18T14:45:12.000Z"
replies: 4
views: 789
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/javascript/191228-settimeout-i-loop"
---

# setTimeout() i loop

## #1 — prplxr, 2013-03-18T13:22Z

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

Permalänk: https://www.webforum.nu/p/191228

## #2 — nitro2k01, 2013-03-18T14:04Z

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.

Permalänk: https://www.webforum.nu/p/2308323

## #3 — prplxr, 2013-03-18T14:18Z

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

Lösningen blev följande:

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

Permalänk: https://www.webforum.nu/p/2308324

## #4 — nitro2k01, 2013-03-18T14:36Z

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.

Permalänk: https://www.webforum.nu/p/2308325

## #5 — prplxr, 2013-03-18T14:45Z

> **[nitro2k01 skrev:](https://www.webforum.nu/p/1559081)**
>
> 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

Permalänk: https://www.webforum.nu/p/2308326

---

Tråden på webben: https://www.webforum.nu/amne/javascript/191228-settimeout-i-loop
