我正在构建一组要从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");
})
我希望这会返回以下
在function1
中 JSON中的doc对象
在function2中
完成!
而不是
功能1中的
在function2中
完成!
空
只要没有findOne()调用,它就会按预期运行。 我错过了什么?
非常感谢
答案 0 :(得分: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");
});
答案 1 :(得分: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);
},