node.js - javascript about event registration and event loop confused -
i try long time figure out, how event , event loop works. read many article in internet , books event registration , event loop, still can not imagine, how works.
i reading book async javascript prgmatic bookshelft event queue, can read in book article.
> when call settimeout, timeout event queued. execution > continues, code after settimeout call runs , on, until no > code more left. after start event loop , detect, > event fired , call handler. after article, have got bit imagination event , async in javascript. try myself following code:
settimeout(function(){alert("hello")},0); (var = 0; <= 100000; i++) { console.log('i loop'); } i have set time 0, because wonna have confirmation sentence
the code after settimeout call runs , on..
and
after start event loop and...
until here, fine how event in javascript works. keep continue reading async javascript book, , had read following:
input events work same way: when user clicks dom element click handler attached, click event queued. handler won't executed until running code had finished.
the first sentence sounds me bit confuse. exmaple:
//some codes #("element").click(function(e){ //do }); //some codes what don't understand here is, when compiler saved click event in event queue? saved in queue after registration(ater code) or when had click element?
in node try code, figure out how event works. consider following code.
var events = require("events"); var event = new events.eventemitter(); event.on('ev1', function () { console.log('into ev1'); }); event.emit('ev1'); (var = 0; <= 5; i++) { console.log('i in loop'); } console.log('i finish loop'); what expected here is:
i in loop in loop in loop in loop in loop in loop finish loop ev1 but got is:
into ev1 in loop in loop in loop in loop in loop in loop finish loop after output, break imagination event(async) execution , event loop had read in book , article in net before. consider sentence in book:
the code after settimeout call runs , so, until no code more left. after start event loop , detect, event fired , call handler.
but why code above eventemitter works opposite? tought event loop execute @ end(after other codes done).
i had read in internet database(for example mongoose) query node async. don't know how async database query definitively works, imaging this:

please explain me, how event in javascript works?
settimeout bit apart eventemitter, due getting these results. first of ask run these examples first.
save in async.html , run in browser. check console see results.
<div id="element"> </div> <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <script> settimeout(function(){console.log("hello")},0); $("#element").click(function(e){ console.log("inside"); }); $("#element").click(); (var = 0; < 5; i++) { console.log('i loop'); } </script> output
inside loop loop loop loop loop hello now save in async.js , run in node.js
settimeout(function(){console.log("hello")},0); (var = 0; < 5; i++) { console.log('i loop'); } output
i loop loop loop loop loop hello you find settimeout works little different eventemitter. eventemitter executes handler whereas settimeout attempts execute immediately. actions not performed until next tick. read here.
do not mix settimeout eventemitter.
edit
your example not demonstrate asynchrony quite well. running loop inside event handler. here more clear example :
var events = require("events"); var event = new events.eventemitter(); event.on("work", function (i,cb) { console.log('started '+i ); settimeout(function(){event.emit("done",i,cb);},math.random()*1000); }); event.on("done", function (i,cb) { cb(i); }); var async = function (cb) { (var = 0; <= 100; i++) { emitclosure(i,cb); } } function emitclosure(i,cb){ settimeout(function(){event.emit("work",i,cb)},math.random()*1000); } async(function (i) { console.log("i have done "+i); }); i point out use settimeout along events give feel of delay of arrival of work , processing delay, unlike synonymous use in question. emitclosure closure loop variables, scope safe.
Comments
Post a Comment