Javascript 按顺序执行mongoose查询,并首先返回成功找到的内容
我使用的是mongoose和bluebird,我在这里尝试的是遍历一个纬度数组,然后用数据库中存在的数组中的第一个,而不是第一个成功返回的查询,将响应发送回前端Javascript 按顺序执行mongoose查询,并首先返回成功找到的内容,javascript,node.js,mongodb,promise,bluebird,Javascript,Node.js,Mongodb,Promise,Bluebird,我使用的是mongoose和bluebird,我在这里尝试的是遍历一个纬度数组,然后用数据库中存在的数组中的第一个,而不是第一个成功返回的查询,将响应发送回前端 我知道bluebird有很多承诺解析技术,比如.any.all.some.settle,但我不知道使用哪一种技术与上面的代码相同。您可以简单地使用$in运算符获取所有,然后从返回的数组中选择一种。它还意味着只有一个db查询,而不是4个 StopsModel.findOne({stop_lat: stations[0]}).exe
我知道bluebird有很多承诺解析技术,比如.any.all.some.settle,但我不知道使用哪一种技术与上面的代码相同。您可以简单地使用$in运算符获取所有,然后从返回的数组中选择一种。它还意味着只有一个db查询,而不是4个
StopsModel.findOne({stop_lat: stations[0]}).exec()
.then(function(stop){
if (stop) res.json(stop);
else {
StopsModel.findOne({stop_lat: stations[1]}).exec()
.then(function(stop){
if (stop) res.json(stop);
else {
StopsModel.findOne({stop_lat: stations[2]}).exec()
.then(function(stop){
if (stop) res.json(stop);
else {
StopsModel.findOne({stop_lat: stations[3]}).exec()
.then(function(stop){
if (stop) res.json(stop);
})
}
})
}
})
}
})
@Molda的答案似乎是可行的,但为了记录在案,问题中的代码可以通过构建一个.catch链来机械化,用于任何长度的站点阵列,如下所示:
StopsModel.find({stop_lat: {$in: stations}}, function(err, stops){
if(!err && stops.length) {
return res.json(stops[0]);
// to get random stop use
// return res.json(stops[Math.random(0, stops.length - 1)]);
}
res.json([]);
});
只要抛出错误,链将继续执行另一个.findOne.exec请求
尽管效率相对较低,但这样做实际上可能有一个优势,即任何不好的站点都不太可能破坏整个企业。除了故意抛出的错误外,还将捕获任何.findOne.exec错误,链将继续。只需使用递归函数即可。我想:我不知道$In是如何工作的,但是stops数组可能不包含错误结果-即那些未通过问题的if stop测试的结果?如果是这样,那么你需要找到第一个好的结果,同时也要考虑到没有好的结果。
stations.reduce(function(promise, station) {
return promise.catch(function() {
return StopsModel.findOne({'stop_lat': station}).exec().then(function(stop) {
if(stop) {
return stop; // success!! break out of the catch chain
} else {
throw new Error(); // continue down the catch chain
}
});
});
}, Promise.reject()).then(function(stop) {
res.json(stop);
}, function(error) {
// no matching stop was found.
// do something with the error.
});