Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按顺序执行mongoose查询,并首先返回成功找到的内容_Javascript_Node.js_Mongodb_Promise_Bluebird - Fatal编程技术网

Javascript 按顺序执行mongoose查询,并首先返回成功找到的内容

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

我使用的是mongoose和bluebird,我在这里尝试的是遍历一个纬度数组,然后用数据库中存在的数组中的第一个,而不是第一个成功返回的查询,将响应发送回前端


我知道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.
});