在我的服务中,我定义了一些使用Http
的方法。
例如:
getUsers(){
this._http.get('someapi')
.map(res=>res.json())
.subscribe(success=>this.users = success; console.log(success))
}
我计划做的是设置此方法以便它返回一个promise,例如:
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
哪个真的不像它应该的那样。我在哪里做错了?
更新
即使我提到Thierry提供的答案,我想我会更详细地解释我的问题。
我的服务中有方法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
}
}
答案 0 :(得分:1)
你应该用这个:
getUsers(){
return this._http.get('someapi')
.map(res=>res.json())
.do(success=>console.log('DONE'));
}
问题是Observable.of
比HTTP请求更快,您在Observable.of
内返回第一个订阅...
如果您希望observable等待先前的observable执行它,您需要利用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];
});
}
}