Angular 2:http.get对String的响应

时间:2017-02-16 19:28:08

标签: angular rxjs angular2-observables

核心问题:

我想将以下响应变为字符串而不是可观察的。

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)

但是,有没有办法在不创建订阅的情况下执行此操作?获得排放和处置可观察物的东西可能......

2 个答案:

答案 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}}"