Использование данных из наблюдаемой подписки для возврата

борется с несколькими днями ниже кода.

подписка выполняется после получения доступа к результату. (проверьте комментарии)

как дождаться завершения подписки, чтобы переменная результата могла быть прочитана и возвращена, пожалуйста, помогите

place.ts
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { String } from 'typescript-string-operations';
import {Observable} from 'rxjs' 
import  { Response } from '@angular/http';
import 'rxjs/add/operator/map'

@Injectable()
export class PlacesProvider {
  apiKey='AIzaSyBuMEEL-0XZX1jSi5yO1GJcuDECegwSD6o';
  baseUrl='https://maps.googleapis.com/maps/api/{0}/json?{1}&key='+this.apiKey;

  constructor(public http: HttpClient) {
  }

nearBy(lat:any,long:any,radius:any):any
{
  var nearbySearchParameters='location='+lat+','+long+'&radius='+radius+'&type=school';
  var apiType='place/nearbysearch';
  var apiUrl=String.Format( this.baseUrl,apiType,nearbySearchParameters);
  console.info("request=>"+apiUrl);
  this.http.get(apiUrl)
  .map(resp=>resp);

}

nearByAddress(address:string,radius:any):any
{
  let nearbysearchResults:Observable<any>;
  let result:any;
  this.getGeoCode(address)
  .subscribe(nbp=>{
             console.info(nbp);//results are here
             result=nbp.results[0];   
          });
          console.info(result); // result is undefined 
          return this.nearBy(result.geometry.location.lat,result.geometry.location.lng,radius); // i want to use this return as observable with pipe on UI which is saying undefined
}

 getGeoCode(address:string):any
{
 var geoCodingPagerameters='address='+address;
  var apiType='geocode';
  var apiUrl=String.Format( this.baseUrl,apiType,geoCodingPagerameters);
  console.info("request=>"+apiUrl);
  var results:any;
  return this.http.get(apiUrl,{ responseType: 'json' })
         .map(resp=>resp);
}

}

Home.ts

getNearbyLcs(): any {
    this.nearbyLcs= this.placesProvider.nearByAddress(this.address.place,'500');
  }

home.html

<ion-title *ngFor = "let lc of (nearbyLcs|async) ">{{lc.name}}</ion-title>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хорошо, вот еще один подход, использующий flatMap(). Пожалуйста, попробуйте.

private nearBy(lat: any, long: any, radius: any): Observable<any> {
    const nearbySearchParameters = 'location=' + lat + ',' + long + '&radius=' + radius + '&type=school';
    const apiType = 'place/nearbysearch';
    const apiUrl = String.Format(this.baseUrl, apiType, nearbySearchParameters);

    console.info("request=>" + apiUrl);

    return this.http.get(apiUrl).map(resp => resp);
}

public nearByAddress(address: string, radius: any): Observable<any> {
    let result: any;

    return this.getGeoCode(address)
        .map(nbp => {
            console.info(nbp);//results are here
            result = nbp.results[0];
        }).flatMap(res => {
            return this.nearBy(result.geometry.location.lat, result.geometry.location.lng, radius);
        }).subscribe(data => console.info(data));

}

просто попробовал это, но результаты даже не регистрируются с console.info (results)

omkar 18.06.2018 10:14
Ответ принят как подходящий

вы можете использовать switchMap и подписаться только тогда, когда вам нужен результат

private nearBy(lat: any, long: any, radius: any): Observable<any> {
            const nearbySearchParameters = 'location=' + lat + ',' + long + '&radius=' + radius + '&type=school';
            const apiType = 'place/nearbysearch';
            const apiUrl = String.Format(this.baseUrl, apiType, nearbySearchParameters);

            console.info("request=>" + apiUrl);

            return this.http.get(apiUrl).map(resp => resp);
        }

    public nearByAddress(address: string, radius: any): Observable<any> {
        return this.getGeoCode(address)
                   .switchMap(nbp => {
                      let result = nbp.results[0];
                      return this.nearBy(result.geometry.location.lat, 
                               result.geometry.location.lng, radius);
            });
    }

    getNearbyLcs(): any {
                this.placesProvider.nearByAddress(this.address.place,'500')
                    .do(console.info)
                    .subscribe((res) => this.nearbyLcs = res);

      }

Другие вопросы по теме