Angular 2: http.get 对字符串的响应

Angular 2: http.get Response to String

核心问题:

我想将以下响应转化为字符串而不是可观察值。

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
}

附加信息:

我需要填充可用照片列表以供用户选择。我将这些照片的 url 绑定到模板,并使用 {{ selectedPic }} 之类的内容进行插值。理想情况下,(click)="selectedPic = gravatarUrl" 会将 selectedPic 的值更改为 gravatarUrl 的值,或者我的组件中任何具有 url 字符串值的变量。

问题是 facebookPhoto 是可观察的。我想将发射存储为字符串。

更新:

这样就达到了将emission存储在字符串类型变量中的目的selectedPic:

this.memberCreationService.getFacebookPicUrl(uid)
.subscribe(picUrl => this.selectedPic = picUrl)

有没有办法在不创建订阅的情况下做到这一点?获得发射并处理可观察到的东西可能...

不,您订阅的是事件,数据在到达应用程序之前并不存在。

Http 模块正在发出异步 Web 请求以获取数据,因此您需要订阅以便在数据存在时得到通知(并采取一些操作,例如将数据分配给变量。

需要订阅。

来自 '@angular/http' 的 angular2 的 Http。 http.get 总是 return 一个 Observable 对象,你可以在函数的签名中看到它:

get(url: string, options?: RequestOptionsArgs): Observable<Response>;

这是因为这个函数是异步运行的,如果你想从服务器获取数据时它必须等待,所以它不能只是 return 你请求的 string/json 对象吧离开。

您应该在函数调用后使用 .subscribe 函数订阅可观察对象 returns,或者如果您导入了 'rxjs/operator/add/toPromise' 模块,则使用 .toPromise()

例如:

getFacebookPhoto("abcd123").subscribe(response => {
    this.myObject = response.json();
}

我建议您阅读有关 Observables 或 Promises 的内容 here

此外,您不需要在此处使用 {{}}:(click)="{{selectedPic = gravatarUrl}}"