可观察对象类型有两个http.Angular 2中的get调用

Observable type with two http.get calls in Angular 2

本文关键字:Angular http 两个 中的 调用 get 对象 观察 类型      更新时间:2023-09-26

在我的ng2服务中,我有一个方法,它有2个http。得到调用。函数看起来像这样:

getInfo(userId: number): any {
    this.http
       .get(apiUrl, options)
       .map(response => response.json())
       .subscribe(example => {
           this.example.FirstName = example.FirstName;
           this.example.LastName = example.LastName;
           this.http
               .get(`/api/${userId}`)
               .map(response => response.json())
               .subscribe(example => {
                   this.example.Street = example.Street;
                   this.example.City = example.City;
                   return this.example;
               });
       });
 }

唯一的问题是,在我的组件中,我不能订阅这个函数,因为它不是Observable<Example>类型。

如果我用Observable<Example>替换函数的any类型,我得到:

声明类型既不是'void'也不是'any'的函数必须返回一个值

但是我确实返回一个值,在响应之后。

如何做到这一点,而不需要两个独立的函数?

是的,我检查了这个答案:https://stackoverflow.com/a/36712707/3264998

试着把这个作为你的方法体,这是解决这个问题的一种方法。

return this.http
   .get(apiUrl, options)
   .map(response => response.json())
   .flatMap(example => {
       this.example.FirstName = example.FirstName;
       this.example.LastName = example.LastName;
       return this.http
           .get(`/api/${userId}`)
           .map(response =>  {
               let example =response.json();
               this.example.Street = example.Street;
               this.example.City = example.City;
               return this.example;
           });
   });

我的解决方案使用rxjs/Rx flatMap:

import {Observable} from 'rxjs/Rx';

ngOnInit() {
  const usersId = ['USR001', 'USR003'];
  this.doRequest(usersId);
}
doRequest(queryArr, previousObservable = null) {
        if (queryArr.length) {
            const url = 'api/' + queryArr.shift();
            let observable = null;
            if (previousObservable) {
                observable = previousObservable.flatMap(() => {
                    return this.http.get(url);
                });
            } else {
                observable = this.http.get(url);
            }
            return this.doRequest(queryArr, observable);
        } else {
            return previousObservable;
        }
    }