node.js async流程控制器--queue(隊列)


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’); 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM