2017-04-19 40 views
0

所以我對JavaScript並不陌生,但我正在嘗試學習Angular2和更多關於JavaScript ES6 Promise的知識,並且我正在通過this tutorial來完成這項工作。在打造的pokedex-service.ts文件中的部分中,getPokemon()的部分功能如下:附加到.json()調用的.results屬性是什麼?

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 ... 
    ); 
} 

據我所知,有角的HTTP服務,它返回一個可觀察,然後將其轉化爲一個承諾(通過toPromise()),但我很困惑下一行會發生什麼: .then (response => response.json().results)

具體而言,我得到response是Promise傳入的佔位符,我知道response.json()將Promise的結果轉換爲JSON對象。但我不知道.results屬性鏈接到response.json()的末尾。

我檢查the Body.json() API,也許以爲這是承諾的屬性,我查the Promises API,卻找不到任何API中對應於results任何屬性(或方法)。這個屬性是什麼,它來自哪裏?

此外,它與簡單使用response.json()有什麼不同?它的返回值是否會傳入下一個then()

+0

如果我猜的話(和我),我會說這是承諾的解決結果通過'以.json()返回'。 – Ouroborus

+0

在我看來,有人正在訪問承諾的內部,他不應該這樣做。 – Bergi

回答

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 } 
    ); 
} 

數據將包含 「結果」 屬性

您應該使用運營商的地圖從 「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';