Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JavaScript] sleep() wait() pauze()

Pagina: 1
Acties:
  • 19.438 views sinds 30-01-2008
  • Reageer

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
Waarde GOTters,

JavaScript topics horen normaalgesproken niet thuis in /14, weet ik, maar dit is volgens mij een uitzondering omdat ik een algemeen probleem heb dat toevallig bij javascript tot uiting komt.

Het gaat om sleep() functionaliteit nabootsen. Java programmeurs kennen de Thread.sleep(), maar JavaScript beschikt niet over dergelijke functionaliteit.

Wel is deze na te bootsen op verschillende manieren:
setTimeout(func, time)
Het nadeel hiervan is dat de code niet echt sleept, maar een nieuwe thread opstart met een bepaalde vertraging. De code onder setTimeout() wordt gewoon uitgevoerd zonder op 'time' te wachten.
while(huidigeTijd < ingesteldeTijd) { }
Voordeel bij deze is dat de code echt stopt. Nadeel is dat je browser hangt totdat de loop klaar is, of bij een andere taal je processor load een oplazer krijgt.

Nu heb ik gegoogled en het blijkt niet echt te bestaan of na te maken in javascript dat het proces echt 'sleept', niks doet. Wel is er een soort van framework/compiler-achtig iets NARRATIVE JavaScript dat met een uitbreiding erop (STRANDS) zegt wel te kunnen slapen, maar is volgens mij behoorlijk wat overhead. Heeft iemand hier ervaring mee?

Wat zou een goede / de best mogelijke oplossing zijn voor sleep() in javascript?

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:12

crisp

Devver

Pixelated

Geef eens een usecase waarbij je deze functionaliteit nodig denkt te hebben?

Intentionally left blank


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
niet echt de oplossing die je wilt natuurlijk, maar setTimeout gebruiken is een oplossing...

JavaScript:
1
2
3
4
5
6
7
8
9
10
function deelVoorTimeOut() {
    // doe dingen
}

function deelNaTimeOut() {
   // doe nog meer dingen
}

deelVoorTimeOut();
setTimeout(deelNaTimeOut(), 5000);

  • storeman
  • Registratie: April 2004
  • Laatst online: 00:34
en, de vaak vergeten, maar wellicht ook toepasbaar:

setInterval(deelNaTimeOut(), 5000);

"Chaos kan niet uit de hand lopen"


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
Usecase:
Custom alerts/prompts/confirms, dus window.alert overriden bijvoorbeeld.

Wat de bedoeling is is dat de native window.confirm() niet meer gebruikt wordt, maar in plaats daarvan een Modal getoond wordt die bijvoorbeeld met AJAX opgehaald wordt of voorgedefinieerd is in de HTML. Bij een window.confirm() 'slaapt' de code totdat een gebruiker ja of nee kiest en window.confirm() returnt dit: var antwoord = confirm('Echt?');

Dit kan niet met een eigen formpje. Tenzij (beknopt voorbeeld)....:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var antwoord;
window.confirm = function (txt) {
   antwoord = null;
   toonForm(txt);
   while (antwoord == null) {sleep(10)};
   return antwoord;
}

function toonForm(txt) {
   ...
}

function buttonClick(bool) {
   antwoord = bool;
}


en vervolgens ergens waar je een confirm nodig hebt kun je gewoon de normale syntax gebruiken.

@setTimeout en setInterval oplossingen: Dat kan hier dus niet omdat je de scope verliest. (Overigens moet bij beide voorbeelden de deelNaTimeOut() tussen quotes staan omdat deelNaTimeOut() anders direct wordt uitgevoerd en het resultaat ervan wordt geevalueerd na de timeout...)

[ Voor 14% gewijzigd door Jurgle op 26-10-2007 11:31 ]

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • disjfa
  • Registratie: April 2001
  • Laatst online: 04-11 11:05

disjfa

be

Ja maar dan laat je toch gewoon je script zijn werk doen en als bv een pagina geladen is kan je MBV ajax javascript en dergelijke gewoon je functie aanroepen?

Sleep is bij html niet nodig. Roep gewoon je script aan als jij dat wilt. Dat kan nu, dat kan bij een response van ajax, dat kan als je ergens op klikt.

[ Voor 33% gewijzigd door disjfa op 26-10-2007 11:32 ]

disjfa - disj·fa (meneer)
disjfa.nl


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
@disjfa: heb je mn case gelezen?

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:12

crisp

Devver

Pixelated

Jurgie: IE ondersteunt ook modal popup-windows, helaas is dat (nog) niet cross-browser compatible...

Intentionally left blank


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
Precies... maar los van de case ben ik erg benieuwd of er een sleep() oplossing of iets wat in de buurt van een sleep() oplossing komt bestaat.

[ Voor 5% gewijzigd door Jurgle op 26-10-2007 12:19 ]

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:12

crisp

Devver

Pixelated

Jurgle schreef op vrijdag 26 oktober 2007 @ 12:10:
Precies... maar los van de case ben ik erg benieuwd of er een sleep() oplossing of iets wat in de buurt van een sleep() oplossing komt bestaat.
nope...

Intentionally left blank


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
hmmmz, iemand ervaring met Narrative js en of strand?

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:20

voodooless

Sound is no voodoo!

Jurgle schreef op vrijdag 26 oktober 2007 @ 12:24:
hmmmz, iemand ervaring met Narrative js en of strand?
Lijkt me behoorlijk overkill om alleen maar even snel een sleep functie te willen hebben...

Do diamonds shine on the dark side of the moon :?


  • .Johnny
  • Registratie: September 2002
  • Laatst online: 27-10 11:50
Als je een modal popup wilt, kun je dit toch nabootsen door een transparante layer over al je content te leggen en daarop een layer te positioneren met je dialog?
Aan elke button op je dialog kun je dan zoals al aangegeven je eigen actie definieren; misschien is het de moeite het eens van die kant proberen te benaderen ipv de sleep te kopieren. Volgens mij is logisch gezien de sleep ook helemaal niet datgene dat je eigenlijk wilt bereiken; maw: zoek de functies om je doel te bereiken ipv de oude functies proberen te kopieren :)

edit; over je scope verlies; dat hoeft helemaal geen probleem te zijn; dan sla je de scope toch op in een globale variabele?

[ Voor 10% gewijzigd door .Johnny op 26-10-2007 13:05 ]


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
@voodooless: Mee eens, daarom ben ik benieuwd of iemand een uitgeklede versie kent of er al wat mee gerommeld heeft.

@.Johnny: Los van het voorbeeld ben ik benieuwd of sleep() kan... volgens mij inderdaad niet. Over het voorbeeld: wat ik wil kunnen doen is:
JavaScript:
1
2
var antwoord = confirm('Echt waar?'); //met door een override mijn
                                      //eigen implementatie van window.confirm
En daar heeft iets sleep()-isch en de scope dus zeker iets mee te maken.

Hoe die modal eruit zien en hoe ik het aanpak is een tweede (scripaculous en Control.modal) maar daar gaat het niet om in deze thread.

[ Voor 6% gewijzigd door Jurgle op 26-10-2007 13:44 ]

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
Schop!

En: wat ook een mogelijkheid zou zijn is een yield achtige operatie... iemand?

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
http://www.subimage.com/dhtml/subModal/ zoiets misschien ? :?
Beter lezen robbie :P

[ Voor 20% gewijzigd door RobIII op 30-10-2007 14:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
Met dat verschil dat subModal hetzelfde doet als wat ik nu al heb, het gebruikt een callback

Ik wil:
JavaScript:
1
var antwoord = showConfirm('echt?');


en niet:
JavaScript:
1
2
var antwoord;
showConfirm('echt?', function (val){antwoord = val;});

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Kijk anders eens in de Ajax Control Toolkit. Daar heb je een kant en klare ModalPopup. En volgens mij zit de source[ erbij in.

Ik zie namelijk eerlijk gezegd niet het verband tussen een modal popup en een sleep...

[ Voor 39% gewijzigd door riezebosch op 30-10-2007 14:59 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
@riezebosch: Dat verband zit hem in:
Jurgle schreef op dinsdag 30 oktober 2007 @ 14:08:
Ik wil:
JavaScript:
1
var antwoord = showConfirm('echt?');

en niet:
JavaScript:
1
2
var antwoord;
showConfirm('echt?', function (val){antwoord = val;});
Maar wat dus ook een optie is ipv sleep() is een Yield constructie... iemand een idee hoe dat te doen of simuleren is in javascript?

[ Voor 17% gewijzigd door Jurgle op 30-10-2007 15:15 ]

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • Toolskyn
  • Registratie: Mei 2004
  • Laatst online: 28-11 14:24

Toolskyn

€ 500,-

Jurgle schreef op vrijdag 26 oktober 2007 @ 11:28:
@setTimeout en setInterval oplossingen: Dat kan hier dus niet omdat je de scope verliest. (Overigens moet bij beide voorbeelden de deelNaTimeOut() tussen quotes staan omdat deelNaTimeOut() anders direct wordt uitgevoerd en het resultaat ervan wordt geevalueerd na de timeout...)
JavaScript:
1
2
3
4
5
6
7
8
function someFunction() {
    var foo = 'bar at ';
    alert(foo + new Date().toUTCString());

    setTimeout(function() {
        alert(foo + new Date().toUTCString());
    }, 3000);
}
De scope is geen enkel probleem als je je deelNaTimeOut() functie binnen je DeelVoorTimeOut() functie defineerd, en zo wordt hij pas uitgevoerd na de timeout. (edit: moet je wel snel klikken met zo'n alert trouwens :P)

[ Voor 4% gewijzigd door Toolskyn op 30-10-2007 20:27 ]

gewooniets.nl


  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 20-11 15:05

Jurgle

100% Compatible

Topicstarter
Toolskyn schreef op dinsdag 30 oktober 2007 @ 20:25:
[...]

JavaScript:
1
2
3
4
5
6
7
8
function someFunction() {
    var foo = 'bar at ';
    alert(foo + new Date().toUTCString());

    setTimeout(function() {
        alert(foo + new Date().toUTCString());
    }, 3000);
}
De scope is geen enkel probleem als je je deelNaTimeOut() functie binnen je DeelVoorTimeOut() functie defineerd, en zo wordt hij pas uitgevoerd na de timeout. (edit: moet je wel snel klikken met zo'n alert trouwens :P)
Neemt niet weg dat je in de ge-Timeout-te functie niet een waarde returnen naar de methode die someFunction() aanriep... Daardoor is setTimeout noch setInterval een optie.

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


  • Toolskyn
  • Registratie: Mei 2004
  • Laatst online: 28-11 14:24

Toolskyn

€ 500,-

Jurgle schreef op woensdag 31 oktober 2007 @ 02:42:
[...]

Neemt niet weg dat je in de ge-Timeout-te functie niet een waarde returnen naar de methode die someFunction() aanriep... Daardoor is setTimeout noch setInterval een optie.
Dat wordt inderdaad lastig, je zou hoogstends een object kunnen returnen in someFunction(), daar in je getimeout-te functie een waarde inzetten, en in je orginele methode ook weer 3 seconden wachten. Maar dat ziet er nou ook niet echt fantastisch uit en je krijgt er dan ook weer problemen mee om in je aanroep-methode iets te returnen.

gewooniets.nl

Pagina: 1