什么是附加到.json()调用的.results属性?

时间:2017-04-19 02:33:38

标签: javascript json promise es6-promise

所以我不是JavaScript的新手,但我正在尝试学习Angular2以及更多关于JavaScript ES6 Promises的内容,而我正在通过this tutorial来完成这项工作。在构建pokedex-service.ts文件的部分中,getPokemon()函数的一部分如下所示:

getPokemon(offset: number, limit: number) {
    return this.http.get(`${this.baseUrl}?offset=${offset}&limit=${limit}`)
      .toPromise()
      .then(response => response.json().results) //<- line in question
      .then(
           // ... etc ...
      );
}

我理解使用Angular的HTTP服务,它会返回一个Observable然后转换为Promise(通过toPromise()),但我很困惑下一行会发生什么: .then (response => response.json().results)

具体来说,我得到response是传递给Promise的占位符,我知道response.json()将Promise的结果转换为JSON对象。但我无法弄清楚.results链接到response.json()末尾的results属性。

我已经检查了the Body.json() API,并且认为它可能是Promises的属性,我检查了the Promises API,但在API中找不到与{{{3}对应的任何属性(OR方法) 1}}。这是什么属性,它来自哪里?

此外,它与简单地使用response.json()有何不同,以及传递到下一个then()的返回值是什么?

1 个答案:

答案 0 :(得分:0)

当您请求服务器时,响应将是一个字符串。 .json()函数在这里说“我将你的字符串响应转换为Javascript对象”。那是json()的工作。然后,一旦有了对象,就可以访问他的财产。这里,服务器返回一个带有属性结果的对象。

getPokemon(offset: number, limit: number) {
    return this.http.get(`${this.baseUrl}?offset=${offset}&limit=${limit}`)
      .toPromise()
      .then(response => response.json().results) //<- line in question
      .then(
           (data) => { // your code }
      );
}

数据将包含“results”属性的内容

您应该使用“Rxjs”库中的运算符映射,如下所示:

return return this.http.get(`${this.baseUrl}?offset=${offset}&limit=${limit}`)
            .map(res => res.json())
            .toPromise();

更通用。使用此代码,即使服务器没有返回具有“results”属性的对象,它也会起作用。

和导入

import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/map';