我想将以下响应变为字符串而不是可观察的。
getFacebookPhoto(uid: string): Observable<any> {
let results = this.http.get('https://graph.facebook.com/' + uid + '/picture?height=200&redirect=false')
.map(response => response.json().data.url.)
return results
}
我需要填充可用照片列表供我的用户选择。我正在使用类似{{ selectedPic }}
的插值将这些照片的网址绑定到模板。理想情况下,(click)="selectedPic = gravatarUrl"
之类的内容会将selectedPic
的值更改为gravatarUrl
的值,或者我的组件中具有字符串值为url的任何变量。
问题在于facebookPhoto
是可观察的。我想将发射存储为字符串。
这实现了将发射存储在字符串类型变量selectedPic
中的目标:
this.memberCreationService.getFacebookPicUrl(uid)
.subscribe(picUrl => this.selectedPic = picUrl)
但是,有没有办法在不创建订阅的情况下执行此操作?获得排放和处置可观察物的东西可能......
答案 0 :(得分:1)
不,您已订阅该活动,并且数据在到达应用程序之前根本不存在。
Http模块正在进行异步Web请求以获取数据,因此您需要订阅在数据存在时被通知(并采取一些操作,例如将数据分配给变量。
订阅是必要的。
答案 1 :(得分:1)
在angular2&#39;来自&#39; @ angular / http&#39;。 http.get将始终返回一个Observable对象,您可以在函数的签名中看到它:
get(url: string, options?: RequestOptionsArgs): Observable<Response>;
这是因为此函数异步运行,如果您想从服务器获取数据,则必须等待,因此它不能立即返回您请求的字符串/ json对象。
您应该在函数调用后使用它返回的.subscribe
函数订阅observable,或者如果导入了.toPromise()
模块,则使用'rxjs/operator/add/toPromise'
例如:
getFacebookPhoto("abcd123").subscribe(response => {
this.myObject = response.json();
}
我建议您阅读Observables或Promises here。
此外,您不需要在此处使用{{}}:(click)="{{selectedPic = gravatarUrl}}"