如果Observable没有返回正确的响应,我该如何继续运行for循环。

时间:2016-10-14 21:58:14

标签: angular google-maps-api-3 firebase ionic2 observable

我使用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的经验,所以非常感谢任何帮助。

1 个答案:

答案 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';