查询数据库时出现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); },