2016-11-19 4 views
0

Я использую асинхронную библиотеку для управления моими асинхронными запросами у веб-рабочего с использованием объекта очереди. Но когда я запускаю очередь объектов команды не вдаваться в режиме простоя oposing к документации, которая говорит убить:async queue не запускается при запуске

убийства: функция, которая удаляет обратный вызов сливного и опустошает оставшиеся задачи из очереди форсирования его простаивать. Вызов с queue.kill().

Я хочу остановить очередь и убить веб-работника, если в одной задаче есть ошибка. Но я узнал, что убийство не завершено, когда я вызываю сообщение, которое говорит моему менеджеру-менеджеру убить этого работника. Вместо этого он бесконечно говорит мне, что простаивание ложно.

Я использую следующий код:

var q = async.queue(function(task, callback) { 
    FileReader.readBlock(task.file, task.offset, task.blockSize) 
    .then(function(block) { 
     return sendBlock(task.uuid, block, task.blockNumber); 
    }) 
    .then(function(result) { 
     callback(null, result); 
    }).catch(function(error) { 
     callback(error); 
    }); 
}, 8); 

q.drain = function() { 
    console.log('All Tasks finished successfully.'); 
}; 

q.error = function(error, task) { 
    this.kill(); 

    while(true) { 
     if(this.idle()) { 
      self.postMessage({ 
       type: 'error', 
       msg: 'A task failed. Upload is killed.' 
      }); 
      break; 
     } 
    } 
}; 

является то, что ошибка в асинхронном или есть ошибка с моей стороны?

ответ

0

Двойная проверка версии используемой вами библиотеки асинхронизации. В версии 2.0 был добавлен обратный вызов error.

Если вы используете версию 1.5, вам нужно будет обрабатывать ошибки в обратном вызове, который вы передаете при добавлении задачи в очередь. Адаптировано из docs:

q.push({name: 'foo'}, function (err) { 
    if (err) { 
     // handle error here 
     q.kill(); 
     // ... etc 
    } 
    console.log('finished processing foo'); 
});