如何给async queue.push一个回调?

时间:2011-11-13 10:04:48

标签: node.js asynchronous

我正在使用async模块push控制流,并想知道我如何为函数/方法q.push()提供async.queue给出的回调?

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

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

我想它类似于task(callback);但是如何收到其他参数,例如 userService

3 个答案:

答案 0 :(得分:3)

以下是如何执行此操作的示例:

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

正如您所看到的,push函数需要2个参数,一个对象和一个回调函数(可以包含任意数量的参数)。
然后在队列函数中,处理你的“作业”(你将使用第一个参数 - 对象),在你认为“作业”完成后你调用回调函数(它被定义为push函数的第二个参数)点。

我自己没试过,但我在这里阅读了文档:https://github.com/caolan/async#queue

答案 1 :(得分:3)

你所推动的是自我调用函数的'return'值。所以在队列中任务是返回值。在这种情况下,任务将是一个接受另一个函数作为回调的函数。回调的参数与使用任务函数调用的参数相同。

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。在队列中,函数将被调用“我是一个服务!” as userService,以及来自队列函数的回调。完成推送的函数后,将通过userService传递userService来触发回调,并告诉异步模块该函数已完成工作,执行下一步。

答案 2 :(得分:0)

就我而言,我使用async.queue作为互斥锁,concurrency = 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);
     });

    }