2016-04-27 93 views
1

在我的服務中,我定義了一些將使用Http的方法。來自http方法的返回流

例如:

getUsers(){ 
    this._http.get('someapi') 
     .map(res=>res.json()) 
     .subscribe(success=>this.users = success; console.log(success)) 
} 

什麼我刨做的,就是建立這種方法,使其返回一個承諾,例如:

this.getUsers().subscribe(success=> DO SOMETHING); 

this.getUsers().then(DO SOMETHING); 

到目前爲止,我得到了這個:

getUsers(){ 
    var getUsersStream = this._http.get('someapi') 
     .map(res=>res.json()) 
     .subscribe(success=>this.users = success ;console.log('DONE')) 

return Observable.of(getUsersStream) 
} 

這的確讓我做:

this.getUsers().subscribe(success=> console.log('after success')) 

然而,當我調試,我可以看到控制檯輸出爲:

after success 
DONE 

這並沒有真正如同它應該。我在哪裏做錯了?

UPDATE

即使我用蒂埃裏提供答案的作品,我想我會解釋我的一些詳細信息的問題。

我有方法getUserById()在我的服務,執行以下操作:

getUserById(someId){ 
    if(this.users.length){ 
     var i = _.findIndex(this.users, {"id":someId}; 
     return this.users[i] 
} else { 
     this.getUsers().then(find the user)//then should be invoked when users are there 
} 
} 

回答

1

你應該使用這樣的:

getUsers(){ 
    return this._http.get('someapi') 
    .map(res=>res.json()) 
    .do(success=>console.log('DONE')); 
} 

的問題是,Observable.of比HTTP請求更快,你回來Observable.of內的第一個訂閱...

如果您希望可觀察值等待先前的可觀察值執行它,你需要利用flatMap運算符。下面是一個示例:

getUsers(){ 
    return this._http.get('someapi') 
    .map(res=>res.json()) 
    .do(success=>console.log('DONE')) 
    .flatMap(success => { 
     // return the new observable. For example a second request 
     return this._http.get('someotherapi').map(res => res.json()) 
    }); 
} 

編輯

關於你的服務的getUserById方法,我會嘗試這樣的事情:

getUserById(someId){ 
    if(this.users.length){ 
    var i = _.findIndex(this.users, {"id":someId}; 
    return Observable.of(this.users[i]); 
    } else { 
    return this.getUsers().do(users => { 
     this.users = users; 
    }).map(users => { 
     var i = _.findIndex(users, {"id":someId}; 
     return users[i]; 
    }); 
    } 
} 
+0

嗯。那麼訂閱和做什麼有什麼區別? – uksz

+0

它允許執行一些處理而無需訂閱。請參閱此文檔:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/do.md。 –

+0

就你而言,你並不是真的想在'getUsers'方法中訂閱。我想你只是想在最後;-) –