我正在构建一组要从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
JSON 中的文档对象
在函数2
中完成!
相反,我得到
在函数 1 中
在函数2
中完成!
零
只要没有 findOne() 调用,它就会按预期运行。我错过了什么??
非常感谢
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");
}
);
但是为什么不使用内部承诺(或其他承诺库)呢?
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 (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);
},