
github: github.com/flowforever/avril.queue
大家要觉得avQ还给力不妨给个start鼓励一下。
npm install avril.queue 目前avQ只支持node.js环境,以后有时间会再添加browser环境支持.
avQ通过queue, $awaitData实现异步流程控制。
$awaitData 可以作为结果返回给其他avQ使用,使用avQ不会打乱原有的程序逻辑结构。
q.$await 方法默认返回回调的第一个参数作为$awaitData 的结果
q.$$await 方法则默认返回第二个参数作为结果并将第一个参数作为error层层上抛
/* assume that we have a file "the/path/of/file.txt" the file content is : 1 2 3 */ var avQ = require('avril.queue'); var q = avQ(); /* return $AwaitData object */ var $fileContent = q.$await(fs.readFile, 'the/path/of/file.txt' , function(err, fileContent){ this.error(err); return fileContent; }); /* conver the $awaitData' result , return a new $AwaitData object */ var $ids = $fileContent.conver(function($org){ return $org.result().split('\n'); }); /* return $AwaitData object which result is list of */ var $users = q.$each(db.User.findById, $ids, function(err, user){ this.error(err); return user; }); q.func(function(){ console.log( $fileContent.result() ) console.log( $users.realResult() ); }); var avQ = require('avril.queue'); var q = avQ(); /* return $AwaitData object */ var $fileContent = q.$$await(fs.readFile, 'the/path/of/file.txt'); /* conver the $awaitData' result , return a new $AwaitData object */ var $ids = $fileContent.conver(function($org){ return $org.result().split('\n'); }); /* return $AwaitData object which result is list of */ var $users = q.$$each(db.User.findById, $ids); q.func(function(){ console.log( $fileContent.result() ) console.log( $users.realResult() ); }); var avQ = require('avril.queue'); var q = avQ(); /* return $AwaitData object */ var $fileContent = q.$await(fs, fs.readFile, 'the/path/of/file.txt' , function(err, fileContent){ this.error(err); return fileContent; }); /* conver the $awaitData' result , return a new $AwaitData object */ var $ids = $fileContent.conver(function($org){ return $org.result().split('\n'); }); /* return $AwaitData object which result is list of */ var $users = q.$each(db.User, db.User.findById, $ids, function(err, user){ this.error(err); /* use this.$$await instead of q.$$await * use this.$$wait, the queue will wait the asynCall ready then go to next step * use q.$$wait only append current asynCall to the end of the queue, it's not what we want */ user.blogs = this.$$await(db.Blogs, db.Blogs.findByUserId, user.id); return user; }); q.func(function(){ console.log( $fileContent.result() ) console.log( $users.realResult() ); }); var avQ = require('avril.queue'); var q = avQ(); var filePath = 'the/path/of/file.txt'; var $fileExisted = q.$await(fs.exists, filePath); var $fileContent; q.$if($fileExited, function(){ /* use this.$$await instead of q.$$await * use this.$$wait, the queue will wait the asynCall ready then go to next step * use q.$$wait only append current asynCall to the end of the queue, it's not what we want */ $fileContent = this.$$await(fs.readFile, filePath); }) q.func(function(){ if($fileContent){ console.log($fileContent.result()); } }); var otherPath = 'the/path/of/otherFile.txt'; q.$if($fileContent, function(){ $fileContent = this.$$await(fs.readFile, filePath); }).$elseIf(q.$await(fs.exits, otherPath), function() { $fileContent = this.$$await(fs.readFile, otherPath); }); q.func(function(){ if($fileContent){ console.log($fileContent.result()); } })