2016-10-07 3 views
1

Я использую async queue для обработки огромного количества данных. Очередь отлично работает, пока я не попытаюсь выполнить обновление в базе данных с помощью метода MongoDB findOneAndUpdate.Почему мои обратные вызовы не запускаются с асинхронной очередью?

я сначала установить очередь, и начинают засовывать предметы к нему из узла Stream:

//Create queue to process all items 
let q = async.queue(processLink, 2); 

// Create Node Stream 
let createStream = function() { 
    let stream = fs.createReadStream(LinkData, {encoding: 'utf8'}); 
    let parser = JSONStream.parse('RECDATA.*'); 
    return stream.pipe(parser); 
}; 

//Listen to 'data' event on stream and add object to queue 
createStream().on('data', function(link){ 
    q.push(link) 
}); 

Вот моя функция задачи, 'processLink. Именно здесь у меня возникают проблемы с поиском проблемы. Всякий раз, когда обратный вызов findOneAndUpdate запущен, он входит в один из условных блоков, и я получаю сообщение на консоль, но когда я вызываю async callback processComplete(), задача не заканчивается так, как ожидалось.

Как следует из названия, почему мои асинхронные обратные вызовы не выполняют каждую задачу?

function processLink(link, processComplete){ 
    if(_.includes(link.URL, 'www.usda.gov') && _.includes(link.URL, '?recid=')){ 
     let url_items = _.split(link.URL, '=',2); 
     let facilityOrgID = url_items[1]; 
     let update = {$push: {"links": link}}; 

     if(_.isNumber(parseInt(facilityOrgID)) && facilityOrgID.length > 4){ 

      Facility.findOneAndUpdate({facilityOrgID: parseInt(facilityOrgID)}, update, (err, result) => { 

       if(err !== null){ 
        console.log("Error:",err); 
        return processComplete(err); /** NOT FIRING **/ 
       } else if(err === null && result !== null){ 

        console.log("Link added to:", result.name); 
        return processComplete(); /** NOT FIRING **/ 
       }else if(err === null && result === null){ 

        console.log('Facility not in database'); 
        processComplete(); /** NOT FIRING **/ 
       }else{ 
        console.log('Something has gone terrible wrong'); 
       } 
      }); 

     }else{ 
      console.log("Invalid facilityID"); 
      return processComplete(); 
     } 

    }else{ 
     console.log('Link Discarded:', link.URL); 
     processComplete(); /** Fires normally **/ 
    } 
} 

ответ

0

Я решил проблему сегодня утром. Обратные вызовы были точными, но, скорее, было состояние состояния, о котором я не знал, поэтому он приводил к состоянию, в котором код никогда не будет вызывать обратный вызов processComplete().

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

Смежные вопросы