2011-11-13 24 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); 
    }); 

    }