我正在使用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 ?
答案 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);
});
}