2015-06-17 33 views
1

我构建了一组要从csv流保存在mongoDB中的对象。对于每一个csv行,我需要在保存之前验证一个或多个对象在MongoDB中不存在。下面的代码在GET路径中运行。查询数据库时出现异步瀑布问题

我一直在尝试使用异步瀑布,但它并不像我预期的那样工作。

下面是代码

async.waterfall([ 
     function (callback) { 

      console.log('in function 1'); 
     --> Diagnosis.findOne({name: diagnosisName}, function (doc){ 
       console.log(JSON.stringify(doc)) 
      }) 
      callback(null); 

     }, 
     function (callback) { 

      console.log('in function2') 
      callback(null) 
     }], 

    function(err, results) { 
     console.log('finished!') 
     res.send("complete"); 
    }) 

我希望它可以在功能1

doc对象返回以下

在JSON

在函数2

成品!

,而不是我得到

在功能1

在函数2

完蛋了!

它运行正常,只要没有findOne()调用。 我在想什么?

非常感谢

回答

1

findOne是一个异步函数。您需要将此函数内的回调移至您期望的顺序。

async.waterfall([ 
    function(callback) { 
     console.log('in function 1'); 
     Diagnosis.findOne({name: diagnosisName}, function(doc) { 
     console.log(JSON.stringify(doc)); 
     callback(null); 
     }); 

    }, 
    function(callback) { 

     console.log('in function2'); 
     callback(null); 
    } 
    ], 

    function(err, results) { 
    console.log('finished!'); 
    res.send("complete"); 
    } 
); 

但为什么不使用内部承诺(或其他承诺lib)?

console.log('in function 1'); 
// exec creates a new promise 
Diagnosis.findOne({name: diagnosisName}).exec(function(doc) { 
    console.log(JSON.stringify(doc)); 
    // resolve this with doc 
    return doc; 
}).then(function(doc) { 
    console.log('in function2'); 
    // resolve this with doc 
    return doc; 
}).then(results) { 
    // results here is just doc from the previous resolution 
    console.log('finished!'); 
    res.send("complete"); 
}); 
0

在你的第一个功能:

function (callback) { 

     console.log('in function 1'); 
    --> Diagnosis.findOne({name: diagnosisName}, function (doc){ 
      console.log(JSON.stringify(doc)) 
     }) 
     callback(null); 

    }, 

您的回调调用findOne这是异步后调用。只要findOne完成,您就应该使用您的回调。 这意味着:

function (callback) { 

     console.log('in function 1'); 
    --> Diagnosis.findOne({name: diagnosisName}, function (doc){ 
      console.log(JSON.stringify(doc)) 
      callback(null); 
     }) 


    }, 

甚至更​​好

function (callback) { 

     console.log('in function 1'); 
    --> Diagnosis.findOne({name: diagnosisName}, callback); 


    }, 
    function (callback, doc) { 
     console.log(JSON.stringify(doc)) 
     callback(null); 
    }, 
+0

你的第二个函数的签名不正确。应该是函数(doc,callback),NOT函数(callback,doc) – Ben