2016-04-27 91 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'方法中订阅。我想你只是想在最后;-) –