2011-11-13 87 views
0

我正在使用async模塊push控制流和想知道如何給函數/方法我q.push()async.queue給出的回調?如何給異步queue.push一個回調?

var q = async.queue(function (task, callback) { 
    task(); 
    callback(); 
}, 1); 

q.push((function(userService){ 
    // stuff to be done 
})(user.Services[i])); 

我想這有點像task(callback);但如何接受蒙山的其他參數,像userService

回答

2

這裏是如何做到這一點的例子:

var q = async.queue(function (userService, callback) { 
    console.log('Here you do your stuff with the userService object'); 
    console.log('Calling the callback function'); 
    callback(null, userService); 
}, 1); 

q.push(userService, function (err, userService) { 
    console.log('finished processing ' + userService.name); 
}); 

正如你所看到的推送功能需要2個PARAMS,對象和回調函數(即可以有很多爭論,只要你喜歡)。
然後在隊列函數中,你處理你的「工作」(你將使用第一個參數 - 對象),並在你認爲「工作」完成後,調用回調函數(它被定義爲第二個參數功能)。

我還沒有嘗試過這個自己,但我看過這裏的文檔:https://github.com/caolan/async#queue

3

你所推的是自我調用函數的「回報」的價值。所以在隊列中任務是返回值。在這種情況下,任務將是一個接受另一個函數作爲回調的函數。回調的參數與使用任務函數調用的參數相同。

var q = async.queue(function (task, callback) { 
    task("I'm a service!",callback); 
}, 1); 

q.push(function(userService,callback){ 
    doSomeStuff(userService); 
    callback(userService);//stuff finished, call the callback given... 
}); // we are passing a function here(not a self invoking function that returns value) 

q.drain = function(userService){ // this will be invoked after finishing the queue 
    stuff(userService); 
} 

在這個例子中,我們將一個函數推入隊列,它接受兩個參數userService和callback。在隊列功能將被稱爲「我是服務!」作爲userService,以及來自隊列函數爭論的回調。在完成推送的功能後,回調將通過userService傳遞給userService來觸發,並告訴異步模塊此功能已完成,請執行下一步。

0

在我的情況下,我用async.queue作爲互斥,併發= 1,每個隊列類型執行單個異步任務的執行(與外部的回調):

function processMyAsyncTaskOnebyOne(params, extCallback){ 
    let queue = this.queues[params.QKey]; 
    if (!queue) { 
     queue = async.queue(function (task, qTaskCallback) { 
       task(qTaskCallback); 
     }, 1); 
     queue.saturated = function() { 
      console.log('queue is saturated ' + params.QKey); 
     }; 
     this.queues[params.QKey] = queue; 
    } 
    var that = this; 
    return queue.push(function (qTaskCallback) { 
      console.log('start new queue task ' + params.QKey); 
      that.myAsyncTask(params, qTaskCallback); 
    }, function (err, result) { 
     // wrap callback 
     console.log('finished queue task ' + params.QKey); 
     if (extCallback) extCallback(err, result); 
    }); 

    }