Download last version: index.js
Asynchronous markers will allow you to avoid the callback hell and tidy the code.
To create a marker, call the addMark():
vardeferred=AsyncMarks();// first marker, the completion of the variable.varfirstMark=deferred.addMark();setTimeout(function(){console.log('first timeout complete, 300ms');firstMark.complete();},300);// second marker, completion through the context of the function.varsecondMark=function(){varthat=this;setTimeout(function(){console.log('second timeout complete, 500ms');that.complete();},500);};To perform all the functions at once, call the method pack(mixed):
// complete pack with array of markersdeferred.pack([firstMark,secondMark, ...,nMark]);// complete pack with arguments of markersdeferred.pack(firstMark,secondMark, ...,nMark);To perform all the functions one by one, call the method series(mixed):
// complete series with array of markersdeferred.series([firstMark,secondMark, ...,nMark]);// complete series with arguments of markersdeferred.series(firstMark,secondMark, ...,nMark);To call a function that is performed after the completion of all functions, perform method complete():
deferred.complete(function(){console.log('all marks complete');});See an example of compiling a template:
varglobalDeferred=AsyncMarks();varglobalMarkQuery=globalDeferred.addMark();varglobalMarkTemplate=globalDeferred.addMark();/** * Mysql queries can be run together, because they are not dependent on each other. */vardeferredQuery=AsyncMarks();varmysql=newMysql(...);varmembers=[];vararticles=[];// get members from mysql dbvarqueryMembers=function(){varthat=this;mysql.query("SELECT * FROM members",function(err,data){members=data;that.complete();});}// get articles from mysql dbvarqueryArticles=function(){varthat=this;mysql.query("SELECT * FROM articles",function(err,data){articles=data;that.complete();});}deferredQuery.pack(queryMembers,queryArticles);deferredQuery.complete(function(){console.log('query load complete');globalMarkQuery.complete();});/** * Template is compiled from multiple files one by one. */vardeferredTemplate=AsyncMarks();vartemplateData=[];vartemplateHeader=function(){varthat=this;fs.load('templateHeader',function(data){templateData.push(data);that.complete();});}vartemplateContent=function(){varthat=this;fs.load('templateContent',function(data){templateData.push(data);that.complete();});}vartemplateFooter=function(){varthat=this;fs.load('templateFooter',function(data){templateData.push(data);that.complete();});}deferredTemplate.series(templateHeader,templateContent,templateFooter);deferredTemplate.complete(function(){console.log('template load complete');globalMarkTemplate.complete();});/** * execute global deffered complete function after load templates and query */globalDeferred.pack(globalMarkQuery,globalMarkTemplate);globalDeferred.complete(function(){varview=newNodeSmarty.assign({'members': members,'articles': articles}).template(templateData.join(''));view.fetch();});