Angular2 - 在另一个Observable中使用Observable返回方法的值

Iva*_*ers 7 observable rxjs typescript ionic2 angular

问题

我不知道如何使用getUserHeaders()我当前返回的Observable的值http.get.

当前错误

Type 'Observable<void>' is not assignable to type 'Observable<Participant[]>'

预期结果

能够使用我的Observable返回方法的值getUserHeaders()作为调用中的headers属性http.而只返回http调用的Observable.

以前的代码

(使用由getUserHeaders()(不是Observable或者Promise)返回的harcoded Headers .

getAllParticipants(): Observable<Array<Participant>> {
    return this.http.get('someUrl',
                {headers: this.getUserHeaders()})
           .map(response => {
               return response.json();
        });
    });
   }
Run Code Online (Sandbox Code Playgroud)

目前的代码

通过使用TypeScript的答案从Angular2中的http数据链接RxJS Observables,我来到了该flatMap方法.(注意此代码当前抛出'当前错误')

getUserHeaders(): Observable<Headers> {
        let headers: Headers = new Headers();

        return NativeStorage.getItem("user").map(
            data => {
                headers.append('API_KEY', data.json().apiKey);
                headers.append('DEVICE_ID', data.json().deviceId);
                return headers
            }).catch( error => {
                console.log("error");
                headers.append('API_KEY', 'TEST');
                headers.append('DEVICE_ID', 'TEST');
                return headers;
            }
        );
    }

/** retrieves ALL the participants from the database */
    getAllParticipants(): Observable<Array<Participant>> {

         return this.getUserHeaders().flatMap( data => {
            return this.http.get('someUrl', {headers: data}).map(response => {
                return response.json();
            });
        });
   }
Run Code Online (Sandbox Code Playgroud)

plunkr(承诺代替Observable)

http://plnkr.co/edit/A0tEB9EUodWQS6AnqrtH?p=info

(注意:Observable.fromPromise()这里没有工作,所以我创建了两个返回promises的方法 - 现在我想使用getUserHeaders()promise里面的值,getParticipants()仍然返回promise/observable getParticipants()而且没有任何内容getUserHeaders()

小智 4

将您的更改getUserHeaders()为如下所示:

getUserHeaders(): Observable<any> { return Observable.of(NativeStorage.getItem("user"); }
Run Code Online (Sandbox Code Playgroud)

然后在 中构造您的 headers 对象getParticipants()。这样你就可以保留flatMap