» »

SetTimeout [Javascript]

SetTimeout [Javascript]

marjan_h ::

Zakaj mi ta skripta prikaže vsakič, ko poženem v istem vrstnem redu? Ali ni setTimeout funkcija asinhrona, torej lahko se zgodi, da se spremeni vrstni red?

setTimeout(() => {
    console.log("Hello")
}, 2000);

setTimeout(() => {
    console.log("world")
}, 2000);

setTimeout(() => {
    console.log("I am")
}, 2000);

setTimeout(() => {
    console.log("John")
}, 2000);


Hvala.

msjr ::

Lahko se zgodi, vendar močno dvomim, da se bo to zgodilo lokalno na hitri mašini, ker je pa treba vzeti v obzir, da se funkcije vseeno štartajo po vrstnem redu kot so zapisane in ne istočasno. Tako da če je output isti, oz. če ni večjih razlik v tem kaj funkcija "dela", se bodo [v večini primerov] izvajale po vrstnem redu kot so zapisane.

Stari89 ::

Kar je napisal msjr.
Priporočam ogled tega izjemo dobrega predavanja glede Javascript event loopa. Nekje okoli 8. minute začne govorit o tvojem primeru, žal ne razloži algoritma nalaganja callbackov na queue.
Po ogledu boš vedel, zakaj tistih 2000ms ni vedno natančno 2000ms pri setTimeout() v JS. ;)

kuall ::

funkcije se bodo nujno ZAČELE v vrstnem redu, kot jih imaš v kodi.
ni pa nujno, da se bodo tudi KONČALE v takem vrstnem redu.
Torej če bi funkcija 2 mlela eno zanko 2 sekundi in šele na koncu izpisala bi bil imel tak izpis:
Hello I am John world
To pa ne pomeni, da se je funkcija 2 začela kasneje kot funkcija 3.

nightrage ::

Za angular-u/typescript vem, da lahko uporabljaš mehanizme async/await, po tem linku sledeč pa lahko to delaš tudi v javascriptu link.

Zimonem ::

marjan_h je izjavil:

Zakaj mi ta skripta prikaže vsakič, ko poženem v istem vrstnem redu? Ali ni setTimeout funkcija asinhrona, torej lahko se zgodi, da se spremeni vrstni red?


setTimeout(() => {
console.log("Hello")
}, 2000);

setTimeout(() => {
console.log("world")
}, 2000);

setTimeout(() => {
console.log("I am")
}, 2000);

setTimeout(() => {
console.log("John")
}, 2000);


Hvala.

Settimeout je zgolj funkcija. Asinshronost pomeni nekaj povsem drugega.

Zgodovina sprememb…

  • predlagal izbris: nightrage ()

nightrage ::

Zimonem je izjavil:

marjan_h je izjavil:

Zakaj mi ta skripta prikaže vsakič, ko poženem v istem vrstnem redu? Ali ni setTimeout funkcija asinhrona, torej lahko se zgodi, da se spremeni vrstni red?


setTimeout(() => {
console.log("Hello")
}, 2000);

setTimeout(() => {
console.log("world")
}, 2000);

setTimeout(() => {
console.log("I am")
}, 2000);

setTimeout(() => {
console.log("John")
}, 2000);


Hvala.

Settimeout je zgolj funkcija. Asinshronost pomeni nekaj povsem drugega.


Zimonem, dej razloži kaj si hotel povedati, ker nekdo je predlagal izbris tvoje trditve. :D

msjr ::

nightrage je izjavil:

Za angular-u/typescript vem, da lahko uporabljaš mehanizme async/await, po tem linku sledeč pa lahko to delaš tudi v javascriptu link.

Čeprav je možno, toplo priporočam da ne delat tako.

Tale primer bo povzročil rahlo kap pri vsakem progamerju, ampak če že mora biti (še enkrat: ne tega delat), naj bo nekako v tem smislu:
setTimeout( function(){
	console.log("Kurac");
	setTimeout( function(){
		console.log("Palac");;
		setTimeout( function(){
			console.log("Portugalac");
		}, 1000);
	}, 1000);
}, 1000);

Zgodovina sprememb…

  • spremenil: msjr ()

nightrage ::

msjr je izjavil:

nightrage je izjavil:

Za angular-u/typescript vem, da lahko uporabljaš mehanizme async/await, po tem linku sledeč pa lahko to delaš tudi v javascriptu link.

Čeprav je možno, toplo priporočam da ne delat tako.

Tale primer bo povzročil rahlo kap pri vsakem progamerju, ampak če že mora biti (še enkrat: ne tega delat), naj bo nekako v tem smislu:

setTimeout( function(){
console.log("Kurac");
setTimeout( function(){
console.log("Palac");;
setTimeout( function(){
console.log("Portugalac");
}, 1000);
}, 1000);
}, 1000);


Ne bom nč trdil za javascript, sam v typescript-u pa async/await mehanizem olajša marsikatero stvar link

Zimonem ::

nightrage je izjavil:

Zimonem je izjavil:

marjan_h je izjavil:

Zakaj mi ta skripta prikaže vsakič, ko poženem v istem vrstnem redu? Ali ni setTimeout funkcija asinhrona, torej lahko se zgodi, da se spremeni vrstni red?


setTimeout(() => {
console.log("Hello")
}, 2000);

setTimeout(() => {
console.log("world")
}, 2000);

setTimeout(() => {
console.log("I am")
}, 2000);

setTimeout(() => {
console.log("John")
}, 2000);


Hvala.

Settimeout je zgolj funkcija. Asinshronost pomeni nekaj povsem drugega.


Zimonem, dej razloži kaj si hotel povedati, ker nekdo je predlagal izbris tvoje trditve. :D

Vsak js ali ts je single thread. Dotična koda se razvije bi preprost loop. Async avait pa čakkata na callback. Kjer se ko so izpolnjeni določeni pogoji postavi flag, da je prispel rezultat in potem procesiraš naprej. Promise pravte javaskriptarji. Ampak v danem primeru je koda sekvenčna in se v nobenem primeru ne izvaja vzporedno ampak zaporedno...

kuall ::

jp.
settimeout nastavi samo nek timer. ko se koda v tem timerju enkrat začne izvrševat se noben drug timer ne bo izvršil, dokler ta koda ne konča. torej ne drži uno kar sem jaz rekel, da bo vrstni red besed drugačen, če imaš dolgo zanko v eni funkciji. enak bo.
da bi bil drugačen bi bilo treba ustvariti thread za vsako funkcijo.

function sleep(num) {
    var now = new Date();
    var stop = now.getTime() + num;
    while(true) {
        now = new Date();
        if(now.getTime() > stop) return;
    }
}


setTimeout(() => {
    console.log("Hello")
}, 2000);

setTimeout(() => {
    sleep(1000);
    setTimeout(() => {		
  	  console.log("world1")
	}, 2000);
    console.log("world2")
}, 2000);

setTimeout(() => {
    console.log("I am")
}, 2000);

setTimeout(() => {
    console.log("John")
}, 2000);



http://jsfiddle.net/jng1L6fp/

Zgodovina sprememb…

  • spremenilo: kuall ()

kuall ::

setTimeout = timer != thread
to je rešitev te teme.

nightrage ::

Koda v typescript-u:

public executeWithDelay(dd: number, funct: Function) : void {
(async (dd: number, funct: Function) => {
await new Promise(f => setTimeout(f, dd));
funct();
})(dd, funct);
}

var callback1 = () : void => { console.log("Hello"); }
var callback2 = () : void => { console.log("World"); }
var callback3 = () : void => { console.log("I am") }
var callback4 = () : void => { console.log("John") }

this.executeWithDelay(2000, callback1);
this.executeWithDelay(2000, callback2);
this.executeWithDelay(2000, callback3);
this.executeWithDelay(2000, callback4);

Zgodovina sprememb…

Zimonem ::

Nima veze z vprašanjem. Ali pa niso znali vprašat

msjr je izjavil:

Lahko se zgodi, vendar močno dvomim, da se bo to zgodilo lokalno na hitri mašini, ker je pa treba vzeti v obzir, da se funkcije vseeno štartajo po vrstnem redu kot so zapisane in ne istočasno. Tako da če je output isti, oz. če ni večjih razlik v tem kaj funkcija "dela", se bodo [v večini primerov] izvajale po vrstnem redu kot so zapisane.

Ali si prizadet ali pa nimaš pojma o izvajanju pri JavaScriptu. Tu ni.a nobene veze hitrost izvajanja. In taki preždeti klikajo predloge za izbris. Sram te bodi.

Zgodovina sprememb…

  • spremenilo: Zimonem ()

Wrop ::

setTimeout je funkcija na window objektu, ki ti po danem času pokliče definirano/podano callback funkcijo. Ta funkcija nima nobene veze z asinhronostjo.
Podane callback funckije se shranijo v interni event loop. Ta si samo zagotavlja, da se bodo funkcije klicale po določenem intervalu. Ob pogoju da je vrsta za obdelavo v event loopu prazna. Če se že izvaja neka časovno dolga funkcija, ki blokira glavni event loop (to je slabo), ti čakajoča sporočila/eventi za obdelavo stojijo. Tak primer funkcije "sleep" je podal kuall. Tam druge čakajoče callback funckije čakajo na dokočanje sleep, setTimeout in console.log funkcije, čeprav je mišljeno, da se izvedejo po 2000 ms. Ampak se ne bodo, ker sleep funkcija blokira glavni event loop, ker se izvaja. Ne bo pa glavni event loop kar po svoje ustavljal izvajanje neke funkcije, zaradi nekega nastavljenega timerja. Niti ne bo ustvarjal nove niti, da se neka funkcija izvede. Še več. Četudi bi v kaullovem primeru, pri izvajanju 2. callback funkcije, po dejansko pretečenih 3 sekundah, izbrisal 3. in 4. callback funkcijo s funkcijo clearTimeout, bi se 3. in 4. callback ne izvedli.

v OP primeru se callback funkcije izvedejo eno za drugo v klicanem vrstem redu. Za to poskrbi sam "javascript" pogon.

Stari89 ::

@nightrage, async/await izvira iz Javascripta, ne iz Typescripta. ;)

Zimonem ::

Stari89 ::

Hah. I stand corrected.

msjr ::

Zimonem je izjavil:

Ali si prizadet ali pa nimaš pojma o izvajanju pri JavaScriptu. Tu ni.a nobene veze hitrost izvajanja. In taki preždeti klikajo predloge za izbris. Sram te bodi.


Imaš prav, nimam pojma, kakšna napaka z moje strani res sem idiot!

Za predlog za izbris se ti opravičujem, sem hotel argumente in ne samo enovrstičnico. Ko sem prebral argumente, sem videl da sem imel popolnoma napačno predstavo o tem kako setTimeout deluje in vsem skupaj hvala, da sem z vašo pomočjo odpravil to zablodo.

Hvala in še enkrat se vsem skupaj opravičujem za dezinformacije.

Zimonem ::

Leporečenje je odveč, kakor dezinformiranje. Witgenstein je rekel " česar ne vemo o tem moramo molčati" . Pa še tega na forumu ne držijo in je postal greznica kjer imagodei predava o administraciji pa je popoln analfabet.

msjr ::

Đorđe Balašević je rekel i ako su lagali mene i ja lažem vas :D


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

HTML zakasnitev povezave

Oddelek: Izdelava spletišč
13668 (276) kuall
»

[Javascript] Začetniško učenje

Oddelek: Programiranje
351221 (261) BBB
»

Slo-Tech userscripts

Oddelek: Izdelava spletišč
174512 (1964) jype
»

Arduino in luči (strani: 1 2 )

Oddelek: Elektrotehnika in elektronika
989293 (6919) FX6300B
»

Event na linku, zelo tricky!

Oddelek: Izdelava spletišč
61003 (830) Phoebus

Več podobnih tem