查询数据库时出现asynchronous瀑布问题

我构build了一组对象从csvstream保存在mongoDB中。 对于每个csv行,我需要在保存之前validation一个或多个对象在MongoDB中不存在。 下面的代码在GETpath中运行。

我一直在尝试使用asynchronous瀑布,但它不像我预期的那样。

这是代码

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

我希望这会返回以下内容

在function1中

doc对象在JSON中

在函数2中

完了!

而是我得到

在函数1中

在函数2中

完了!

空值

只要没有findOne()调用,它就按预期运行。 我在想什么?

非常感激

findOne是一个asynchronous函数。 您需要在此函数内移动callback以遵循您期望的顺序。

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

在你的第一个function:

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

在调用asynchronous的findOne之后调用你的callback函数。 只要findOne完成,就应该使用callback函数。 意思是:

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