2017-02-03 112 views
0

從'./Users/edwardhung/Desktop/timesheet-web-app/timesheet-web-app-new/src/app/services/user.service'導入{UserService}; 我使用的角2與firebase。目前我有以下功能,需要一個UID去firebase中的一個分支來查找存儲用戶信息存儲路徑的數據。 當數據返回時,我創建了第二個請求並根據路徑獲取數據。Angular 2可觀察的備選語法

從UserService.ts

getUserInformation(uid: string) { 
    return this.angularFire.database.object('/pathForUid/' + uid).map(results => { 
     return this.angularFire.database.object('/' + results.path) 
    }); 
} 

這是我如何調用該函數

this.userService.getUserInformation(data.uid) 
    .subscribe(result => { 
    result.subscribe(res => { 
     let user: User = res; 
     this.userService.setCurrentUser(user); 
    }) 
}); 

一切工作正常,除了在這裏我發現這個語法,將兩個返回升技怪異和兩個訂閱。 當我在Swift中編寫代碼時,它只是在回調中回撥,而不需要返回兩次或訂閱兩次。

這是唯一正確的方法來做到這一點,或者是否有一種替代語法,我不必訂閱兩次? 對我來說,在我稱之爲函數的地方有兩個訂閱沒有意義。我在想也許有辦法做下面的事情

this.userService.getUserInfoInOneGoWithId(data.uid) 
    .subscribe(result => { 
    let user: User = result; 
}); 
+1

看起來像你想**鏈**兩個observable,這通常與[.mergeM ap()](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeMap)運算符。語法類似於'obs1.mergeMap(obs2)',其中'obs2'可以使用'obs1'返回的數據,並繼續使用通常的操作符來轉換結果。看看這裏的例子:http://stackoverflow.com/a/42021832/1153681 – AngularChef

回答

0

正如@AngularFrance所說的,你想鏈接你的觀察對象。

,但使用的mergeMap,您可能需要使用switchMap

// mock the service which returns http response (observable) 
// return a user for some uid 
const someService = 
    (uid) => 
    Observable 
     .of({ user: 'Unicorn' }) 
     // simulate an HTTP delay 
     .delay(1500) 

const { Observable } = Rx 

const obs = Observable.of({ uid: 'some-uid' }) 

obs 
    .do(_ => console.debug('starting an http request')) 
    .switchMap(uid => 
    someService(uid) 
     .do(_ => console.log('response received !')) 
     .map(user => console.debug(user)) 
) 
    .subscribe() 

結果是:

// output instantly : 
starting an http request 

// outputs 1.5s later : 
response received ! 
{user: "Unicorn"} 

這裏有一個工作Plunkr:
https://plnkr.co/edit/s7YUROGAJ9RzHxj5vi82?p=preview (打開控制檯)