所以基本上我正在进行数据库查询,获取具有特定ID的所有帖子,然后将它们添加到列表中,这样我就可以返回了。但是在回调完成之前返回列表。
如何在回调完成之前阻止它被返回?
exports.getBlogEntries = function(opid) {
var list12 =[];
Entry.find({'opid' : opid}, function(err, entries) {
if(!err) {
console.log("adding");
entries.forEach( function(currentEntry){
list12.push(currentEntry);
});
}
else {
console.log("EEEERROOR");
}
//else {console.log("err");}
});
console.log(list12);
return list12;
};
答案 0 :(得分:0)
您可以使用同步数据库调用,但这可以解决node.js的概念。
正确的方法是将回调传递给查询数据库的函数,然后在数据库查询回调中调用提供的回调。
答案 1 :(得分:0)
如何在回调完成之前阻止它被返回?
回调是异步的,你无法避免。因此,您不能return
列表。
相反,在填充时提供回调。或者返回列表的Promise。例如:
exports.getBlogEntries = function(opid, callback) {
Entry.find({'opid': opid}, callback); // yes, that's it.
// Everything else was boilerplate code
};
答案 2 :(得分:0)
所有回调都是异步的,因此我们无法保证它们是否按照我们保留的顺序运行。
要修复它并使流程“同步”并保证订单执行,您有两个解决方案:
而不是:
MyModel1.find({}, function(err, docsModel1) {
callback(err, docsModel1);
});
MyModel2.find({}, function(err, docsModel2) {
callback(err, docsModel2);
});
使用它:
MyModel1.find({}, function(err, docsModel1) {
MyModel2.find({}, function(err, docsModel2) {
callback(err, docsModel1, docsModel2);
});
});
上面的最后一个片段保证我们MyModel2
将被执行 AFTER MyModel1
。
示例:
async.series(
{
function1 : function(callback) {
//your first code here
//...
callback(null, 'some result here');
},
function2 : function(callback) {
//your second code here (called only after the first one)
callback(null, 'another result here');
}
},
function(err, results) {
//capture the results from function1 and function2
//if function1 raise some error, function2 will not be called.
results.function1; // 'some result here'
results.function2; // 'another result here'
//do something else...
}
);
答案 3 :(得分:0)
有另一种方法可以处理这种情况。您可以使用async模块,当forEach完成后,进行返回调用。请在下面找到相同的代码段:
var async = requires('async');
exports.getBlogEntries = function(opid) {
var list12 =[];
Entry.find({'opid' : opid}, function(err, entries) {
if(!err) {
console.log("adding");
async.forEachSeries(entries,function(entry,returnFunction){
list12.push(entry);
},function(){
console.log(list12);
return list12;
});
}
else{
console.log("EEEERROOR");
}
});
};