Как мне предоставить асинхронную очередь.отправить обратный вызов?

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

    }