我使用Google maps API让用户搜索某个城市,然后根据addressType查询我的Firebase数据库。谷歌回复返回不同的addressTypes(locality,add_level_1,add_level_2,...),如果我没有得到结果,我希望能够执行不同的查询。
我的项目应该如何运作:我得到Google API的对象,然后根据我搜索POI的信息,首先根据' locality',如果没有& #39; t返回一个结果(在firebase中找不到任何对象)我执行相同的查询,但是基于' adm_level_2',依此类推。
到目前为止我所做的事情:我能够获得Google API响应,然后执行查询以根据' locality'来查找POI。 ,并在我的应用程序中显示响应。但是,如果第一个查询没有返回结果,我无法弄清楚如何执行第二个(和第三个)查询。
到目前为止我的代码:
var componentForm = {
street_number: 'short_name',
route: 'long_name',
locality: 'long_name',
administrative_area_level_1: 'short_name',
administrative_area_level_2: 'long_name',
country: 'long_name',
postal_code: 'short_name'
};
for (var i = 0; i < place.address_components.length; i++) {
this.addressType = place.address_components[i].types[0];
if (componentForm[this.addressType]) {
if (this.addressType == "locality") {
this.locality = place.address_components[i][componentForm[this.addressType]];
let rsltBusiness = [];
self._dataService.getCompaniesForLocationObs(this.addressType,this.locality)
.map(i=>{return i})
.subscribe(i => self.staticData =i
);
}
if (this.addressType == "administrative_area_level_2") {
console.log("adm_level_2 ");
this.adm_level2 = place.address_components[i][componentForm[this.addressType]];
} if (this.addressType == "administrative_area_level_1") {
this.adm_level1 = place.address_components[i][componentForm[this.addressType]];
}
}
}
所以有效的第一部分是&#39;如果(this.addressType ==&#34; locality&#34;)&#39; 但是如果它没有返回结果我应该能够执行相同的查询但是从 &#39; if(this.addressType ==&#34; administrative_area_level_2&#34;){&#39;
这可能吗?如果是的话,我应该如何处理?或者我是否正在尝试做一些反对正确使用Observables和Angular2 / Firebase的事情?
我没有很多Angular2的经验,所以非常感谢任何帮助。
答案 0 :(得分:0)
不确定这是否可以开箱即用,因为我无法测试代码,但我会尝试解释校长,你实现它:
// create a list of types you want to check against from API response
let addressTypes = [];
let addressLocality = {};
for (var i = 0; i < place.address_components.length; i++) {
let type = place.address_components[i].types[0]
addressTypes.push( type );
addressLocality[ type ] = place.address_components[i][componentForm[type]]
}
// Search database for each 'addressType' you found.
Observable.from(addressTypes)
.mergeMap(type => self._dataService
.getCompaniesForLocationObs(type, addressLocality[type]))
// Assuming 'getCompaniesForLocationObs()' returns false if it doesn't find anything
.filter(Boolean)
// If something is found stop
.take(1)
// Execute!
.subscribe(i => self.staticData = i)
请记住,observable在评估下一个源项之前评估为每个源项设置的整个运算符链。所以你只需要创建一个你想要从API响应中查询的东西的列表(我的for循环可能不起作用)并且让observable做它的事情(;
不要忘记进口:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/operator/take';
import 'rxjs/add/operator/filter';