2015-09-26 47 views
0
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); 
         }) 
        } 
       }) 
      } 
     }) 
    } 
}) 

我使用的猫鼬和蓝鸟,我想要做的,是要经过纬度的数组,以便发送一个响应返回给前端与数据库中存在的第一个数组,而不是第一个成功返回的查询。执行猫鼬查询和第一返回找到了一些成功

我知道,蓝鸟有许多诺言分辨率技术,如.ANY。所有。有些.settle,但我想不出使用哪一个将相同的工作,上面的代码。

+0

只需使用递归函数。 – Bergi

回答

0

您可以简单地使用$ in操作符来获取所有内容,然后从返回的数组中简单地选择一个。此外,它意味着只有1分贝查询,而不是4

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([]); 
}); 
+0

想法:我不知道'$ in'是如何工作的,但是'stops'数组可能不包含虚假结果 - 也就是说那些在if(stop)'测试失败的问题?如果是这样,那么你将需要找到第一个好结果,并且还要迎合没有好结果。 –

0

@ Molda的答案看起来似乎是去,但备案,在问题的代码可以实现机械化的stations阵列任意长度的方式通过建立一个.catch()链如下:

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

只要错误抛出,环比将继续与其他.findOne().exec()请求。

尽管效率相对较低,但实际上可能有这样做的优势,因为任何不良的station都不太可能让整个企业受损。除了故意引发的错误之外,任何.findOne().exec()错误也将被捕获并且链将继续。