queue流程控制器是一個并行的流程控制器,但是它與parallel的區別在于queue可以控制一次執行幾個函數,而parallel只是讓所有函數并行執行.
例子如下:
var q = async.queue(function (obj,cb) {setTimeout(function () {console.log(obj);cb(); },obj.time) },1)for (var i = 0; i<100; i++) {
console.log(1);
q.push({name:i,time:i*1000},function (err) {
console.log(err);
}) };for (var i = 0; i<100; i++) {console.log(2);q.push({name:1,time:1000},function (err) {
console.log(err);
}) };
?
這里用了一個偽異步執行的方式,queue的參數有兩個,第一個是一個函數,第二個是執行的進程數,第一個參數又包含兩個參數,第一個是傳遞的對象,第二個是回調函數,例子中只有在console.log(obj)執行完后調用cb();隊列才會往下執行,queue會返回一個標識符(例子中的q).
例子中的q.push是往隊列中添加數據(會被queue里的obj接收),第二個參數是一個回調函數,如果有異常會觸發此回調函數。例子中每次只插入一個數據,也可以插入多個例如q.push([{name:0,time:1000}],{name:1,time:2000}]);(這里是個數組).
這里為了確認循環是否真的執行,所以在循環中打印了兩個數字.執行的結果是先循環打印了console.log(1)然后再循環打印了console.log(2),這里說明 ?確實兩個循環執行到了,然后會先把第一個循環加入到queue里的對象打出來,然后把第二個循環打印出來,充分遵守了隊列的性質:先進先出,后進后出的規則,不會因為因為執行的時間而使得結果混亂.如果把queue里的工作數改為2,則會每次打印兩個.
?
queue還有幾個函數,比如:
worker數量將用完時,會調用saturated函數:
q.saturated = function() { log(‘all workers to be used’); }
?
當最后一個任務交給worker執行時,會調用empty函數
q.empty = function() { log(‘no more tasks wating’); }
?
當所有任務都執行完時,會調用drain函數
q.drain = function() { console.log(‘all tasks have been processed’); }
?