为什么我的回调没有使用异步队列触发?

时间:2016-10-07 18:04:27

标签: node.js mongodb asynchronous

我正在使用async queue来处理大量数据。在我尝试使用MongoDB findOneAndUpdate方法在数据库中执行更新之前,队列运行良好。

我首先建立队列,然后从节点流开始向它推送对象:

//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回调时,它都会输入其中一个条件块,并且我将消息记录到控制台,但是当我调用异步回调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 **/ 
    }
}

1 个答案:

答案 0 :(得分:0)

今天早上我解决了我的问题。回调很好,但是有一个我不知道的数据的条件状态,因此它导致了一个状态,其中代码永远不会调用processComplete()回调。

如果其他人发现自己处于相似的绑定状态,并且您拥有大量数据,我会确保您的数据准确报告,并且没有一些边缘情况未按预期处理。