#node.js #asynchronous
#node.js #асинхронный
Вопрос:
Я использую поток управления push модулями async и задаюсь вопросом, как я могу предоставить функции / методу I 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?
Ответ №1:
Вот пример того, как это сделать:
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 параметра: объект и функцию обратного вызова (которая может иметь столько аргументов, сколько вам нравится).
Затем в функции queue вы обрабатываете свое «задание» (вы будете использовать первый параметр — object) и после того, как вы сочтете «задание» завершенным, вы вызываете функцию обратного вызова (которая определяется как 2-й параметр функции push).
Я сам этого не пробовал, но я прочитал документацию здесь:https://github.com/caolan/async#queue
Ответ №2:
То, что вы нажимаете, — это «возвращаемое» значение самозапускающейся функции. Итак, в задаче queue находится возвращаемое значение. В этом случае task будет функцией, принимающей другую функцию в качестве обратного вызова. Аргументами для обратного вызова будут те же аргументы, что и при вызове функции task.
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, и обратный вызов из функции queue аргументируется. После завершения выполнения функции будет запущен обратный вызов с переданным UserService, который был UserService, и который сообщает асинхронному модулю, что эта функция завершила работу, выполните следующую.
Ответ №3:
В моем случае я использовал 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);
});
}