2016-09-23 4 views
0

У меня есть проблема с двумя последовательными подписками на два отдельных наблюдаемых в угловом 2. Я пытаюсь:Два последовательных подписки на два отдельных наблюдаемых угловых 2

  1. получит место от координат
  2. прикрепить это место к моему JSON
  3. отправить JSON на сервер

Как мне сделать это, я считаю, неправильно:

this._locationService.geocode(this.location.latitude, this.location.longitude). 
     subscribe(position => { 
      this.location.city = this.findAddressPart(position, "locality", "long"); 
      this.location.country = this.findAddressPart(position, "country", "long"); 
      this._locationService.updateLocation(this.location) 
       .subscribe(
        location => { 
         this.location = location; 
         this.submitted = true; 
         this.submitting = false; 
        } 
       ); 
     }); 

Таким образом, мой DOM обновляется только через 5-10 секунд после того, как я нахожусь на месте.

+0

Вы пытались запустить это в угловой зоне? using this.zone.run (() => {}) Вы должны выполнять только назначения местоположений внутри зоны – galvan

+0

Как это работает? – Mantas

+0

Пожалуйста, обратитесь к этой статье: http://www.joshmorony.com/understanding-zones-and-change-detection-in-ionic-2-angular-2/ – galvan

ответ

0

Кажется, что у вас возникла проблема с тем, как долго ваше решение требуется для обновления. К сожалению, это не так, если вы не реструктурируете, как ваши _locationService используют данные. В настоящее время у вас есть:

  1. ПОЛУЧИТЬ геокод от широты и долготы
  2. ждать запрос, чтобы завершить
  3. набор данных из запроса № 1 к месту
  4. данные обновления
  5. прибудете от места
  6. ожидания для запроса на закончить
  7. набор местоположения обновления
  8. обновления DOM ж/обновляемого место

Есть два запроса, соединенных вместе. Если это возможно, я бы объединить эти две функции в одном вызов на вашем внутреннем интерфейсе, так что вы можете назвать что-то вроде

this._locationService.geocode(this.location.latitude, this.location.longitude). 
     subscribe(location => { 
      this.location = location; 
      this.submitted = true; 
      this.submitting = false; 
     }); 

Конечно, это будет работать только если ваш сервер содержит данные для обслуживания этого типа запроса. Если сервер также должен делать HTTP-вызовы, то изменение его на вышеуказанное будет спорным.

Если вышеуказанное невозможно, вы можете обновить DOM после завершения первого запроса. Если все будет хорошо, функция updateLocation вернет то же местоположение, которое было отправлено на сервер, так или иначе? Вы можете обновить DOM с локально доступными значениями и вместо обновления DOM при успешном выполнении второй функции изменить их только при возникновении ошибки. Это заставит ваше время отклика на 50% быстрее. Что-то вроде этого.

this._locationService.geocode(this.location.latitude, this.location.longitude). 
     subscribe(position => { 
      this.location.city = this.findAddressPart(position, "locality", "long"); 
      this.location.country = this.findAddressPart(position, "country", "long"); 
      // SET DOM HERE using this.location values 
      this._locationService.updateLocation(this.location) 
       .subscribe(
        location => { 
         this.location = location; 
         // optionally SET DOM HERE again 
         this.submitted = true; 
         this.submitting = false; 
        }, 
        error => { 
         // SET DOM HERE reflecting error 
        } 
       ); 
     }); 
Смежные вопросы