从http方法返回流

时间:2016-04-27 09:45:01

标签: angular rxjs

在我的服务中,我定义了一些使用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
}
}

1 个答案:

答案 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];
    });
  }
}