首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角RxJS mergeMap类型

角RxJS mergeMap类型
EN

Stack Overflow用户
提问于 2018-08-24 18:32:41
回答 2查看 1.2K关注 0票数 2

尝试使用list.service请求URL将地理位置服务的经度和纬度提取到http.get中。

第一期:

“{}”类型上不存在企业属性“业务”

感谢你在这个问题上的帮助和时间

list.service.ts

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { List } from '../models/list.model';
import { map } from 'rxjs/operators';
import { GeolocationService } from '../services/geolocation.service';
import { mergeMap } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class ListService {
    private serverApi = 'http://localhost:3000';

    constructor(private http: HttpClient, private geoServ: GeolocationService) { }

    public getAllLists(): Observable<List[]> {
        return this.geoServ.getGeoLocation().pipe(
          mergeMap<{businesses: List[]}>(({ latitude, longitude }) =>             
            this.http.get(`${this.serverApi}/yelp/${longitude}/${latitude}`).pipe(
            )
          ),
          map(res => res.businesses));
    }
}

geolocation.service.ts

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { Observable, Subject, asapScheduler, pipe, of, from, interval, merge, fromEvent, SubscriptionLike, PartialObserver } from 'rxjs';
@Injectable({
  providedIn: 'root'
})
export class GeolocationService {

  constructor() { }

  getGeoLocation() {
    return new Observable((observer) => {
      console.log('Geolocation working!');
      const options = {
        enableHighAccuracy: true,
        timeout: 5000,
        maximumAge: 0
      };
      const success = (pos) => {
        const crd = pos.coords;
        console.log(`Longitude : ${crd.longitude}`);
        const location = {
          "latitude" : crd.longitude,
          "longitude": crd.longitude
        };
        observer.next(location);
        observer.complete();
      };
      const error = (err) => {
        console.warn(`ERROR(${err.code}): ${err.message}`);
        observer.error(err);
        observer.complete();
      };
      navigator.geolocation.getCurrentPosition(success, error, options);
    });  
  }
}

list.model.ts

代码语言:javascript
复制
export interface List {
    id: string;
    name?: string;
    rating?: number;
    review_count?: number;
    url?: string;
    location: string;
    display_name?: string;
    image_url?: string;
    is_closed?: boolean;
}

添加了model.ts以帮助澄清

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-24 18:59:43

您的代码说GET返回一个List[],但是数组不会有一个businesses属性,这就是为什么它在抱怨。您可以使用:

代码语言:javascript
复制
  public getAllLists(): Observable<List[]> {
    return this.geoServ.getGeoLocation().pipe(
      mergeMap(({ latitude, longitude }) =>
        this.http.get<any>(`${this.serverApi}/yelp/${longitude}/${latitude}`)
      ),
      map(res => res.businesses));
  }

这将编译,但如果响应确实是一个数组,则Observable可能最终会发出undefined

票数 2
EN

Stack Overflow用户

发布于 2018-08-24 18:48:45

似乎你还在使用旧的角质化http客户端。这对打字也不起作用。若要修复类型,请将类型对象添加到mergeMap泛型参数

代码语言:javascript
复制
public getAllLists(): Observable<List[]> {
  return this.geoServ.getGeoLocation().pipe(
    mergeMap<{latitude: string, longitude: string}, {businesses: List[]}>(({ latitude, longitude }) =>             
      this.http.get(`${this.serverApi}/yelp/${longitude}/${latitude}`).pipe(
        map(res => res.json()), // remove after updating to new http client
      )
    ),
    map(res => res.businesses));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52010000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档