4 ms·
setTimeout drives me crazy. How can I implement "sleep" without going insane?
by heyrhett 16y ago
setTimeout drives me crazy. How can I implement "sleep" without going insane?
- johnswamps 16y agoYour problem is not with setTimeout, you need to learn how to write evented code because that is how javascript works and you're going to encounter this problem in different contexts. Passing in a closure to setTimeout usually suffices though, it's just slightly uglier than a normal "sleep" call. If you really, really wanted to you could create a busy wait sleep function, but it's an awful idea and you should never do it.
- geuis 16y agoSo you should never think of "sleep" in javascript. Since the language is single-threaded, really if you pause the script you're pausing the entire environment (whether its in the browser or on the server in something like Node.js). But, to answer your question: // some code runs here var continue = function(data){ //more code runs in here after sleep } setTimeout(function(){ continue(data); },2000); A different pattern: var obj = { sleep: function(fn, time){ setTimeout(fn, time ); }, func1: function(data){ console.log('Continuing'); }, init: function(data){ console.log('Starting'); obj.sleep(obj.func1, 2000); } } obj.init()
- psykotic 16y agoIMO, a better pattern is to use lexical closures in continuation-passing style to share state: function sleep(time, continuation) { setTimeout(continuation, time); } function start_process(x) { var y = foo(x); sleep(1000, function() { var z = bar(x, y); sleep(2000, function() { baz(x, y, z); });}); } start_process(42);
- geuis 16y agoExcept that you basically wrote the same thing as my second example, except your functions aren't namespaced and are polluting globals.