2017-10-19 60 views
0
返回的數據

在下面的服務方法中,我使用Promise.all將兩個並行查詢傳遞給服務器。結果被返回並存儲在productCategoryData數組中。這個數組被記錄到控制檯並且數據被驗證。訪問由Promise.all

服務方法然後

public getProductCategoryData() { 
var productCategoryData = []; 

return Promise.all([this.http.get(this.specialValueUrl), 
    this.http.get(this.applianceBrandUrl)]) 
.then(function(responses) { 
    responses[0].toPromise(). 
    then(response => { 
     let specialvalues: SpecialValue[] = response.json(); 
     productCategoryData[0] = specialvalues; 
     // console.log(specialvalues) 
    }); 

    responses[1].toPromise(). 
    then(response => { 
     let applianceBrands: ApplianceBrand[] = response.json(); 
     productCategoryData[1] = applianceBrands; 
     // console.log(applianceBrands) 
    });   

    return productCategoryData; 
}) 
    } 

的productCategoryData數組傳遞到其被再次記錄到控制檯的組件。然後,將productCategoryData數組的數據分配給組件中定義的兩個數組:this.specialValues和this.applianceBrands。但是它們在登錄到控制檯時未定義。我期望這些數組有數據。

組件的方法:

private getProductCategoryData() { 
this.productCategoryService.getProductCategoryData() 
.then(productCategoryData => { 
    this.specialValues = productCategoryData[0]; 
    this.applianceBrands = productCategoryData[1]; 

    console.log('productCategory.Data = ', productCategoryData) //has data 
    console.log('this.specialValues = ', this.specialValues) //undefined 
    console.log('this.applianceBrands = ', this.applianceBrands) //undefined 

}); 
    } 
+0

這是AngularJS(角1.x版)或角(角V2 +)?如果AngularJS,請將標籤更改爲'angularjs'。 – DeborahK

+0

這是角2 – koque

+0

好吧,所以我假設你的意思是「組件​​」方法而不是「控制器」方法?是否有可能在這裏使用Observables而不是Promises? – DeborahK

回答

1

你的問題是服務內。這裏有一些事情正在進行。

  • http.get返回可觀察。這必須訂閱或轉換爲Promise
  • Promise.all()將正常工作的承諾,但將只傳遞它被賦予什麼其他的事(如可觀察到的或變量等)

爲了解決這個問題只需將您的觀測量(HTTP。 get())到Promise並返回。

由於您將observables傳遞給promise.all()它看起來像您需要將結果自己轉換爲回調中的承諾,但這是不必要的。

這是所有你需要:

服務:

public getProductCategoryData() { 
    return Promise.all([this.http.get(this.specialValueUrl).toPromise(), 
    this.http.get(this.applianceBrandUrl).toPromise()]) 

} 

組件:

private getProductCategoryData() { 
this.productCategoryService.getProductCategoryData() 
    .then(productCategoryData => { 
     this.specialValues = productCategoryData[0]; 
     this.applianceBrands = productCategoryData[1]; 

     console.log('productCategory.Data = ', productCategoryData) //has data 
     console.log('this.specialValues = ', this.specialValues) //undefined 
     console.log('this.applianceBrands = ', this.applianceBrands) //undefined 

    }); 
    } 
1

您正在返回productCategoryData您通過分配異步響應之前,兩個內部then回調。

相反,轉換爲承諾將Promise.all前,然後用mapjson方法應用於結果:

return Promise.all([this.specialValueUrl, this.applianceBrandUrl].map(url => 
    this.http.get(url).toPromise() 
).then(responses => responses.map(response => response.json()));