我有一個服務呼叫,它呼叫 API 以回傳 JSON。然后我有一個呼叫服務呼叫的訂閱函式。JSON 回傳正常,服務呼叫并訂閱所有作業。但是,在其構建管道中構建我的應用程式時,我收到以下錯誤“未捕獲(承諾)型別錯誤:無法將未定義或空值轉換為物件。” 并且我的構建失敗了(即使它在本地運行良好并通過了所有測驗)。我正在使用 angular 9 和打字稿。
我的訂閱和它的功能是這樣的:
houseData: HouseValueObject;
houseNumber = '12345';
callHouseService() {
this.streetHouseService.getHouseData(this.houseNumber).subscribe(
async (data) => {
this.houseData = await data;
const keys = Object.keys(this.houseData.extensiveHouseData);
this.extensiveHouseDataList = keys.map(k => this.houseData.extensiveHouseData[k]);
}
)
}
getHouseData 方法如下所示:
export class HouseService {
private readonly relativeURL = 'services/api/houseinfo/'
constructor(private http: HttpClient) {
getHouseData(houseNumber: string): Observable<HouseValueObject> {
return.this.http.get<HouseValueObject>(this.relativeURL houseNumber '/');
}
}
}
HouseValueObject 的值物件如下所示:
export class HouseValueObject {
numberBathrooms: number;
extensiveHouseData: HouseValue[];
}
我認為添加 async 和 await 會暫停執行,直到回傳的承諾完成,以便將 JSON 資料傳遞給const keys = Object.keys... 代碼行會起作用,但情況似乎并非如此。我的問題是,我怎樣才能正確地暫停執行,直到回傳的承諾得到滿足以確保 JSON 資料存在并且const keys = Object.keys...代碼行像本地一樣作業?
uj5u.com熱心網友回復:
我個人會重寫服務以回傳承諾,應該更容易閱讀。
HouseService:
getHouseData(houseNumber: string): Promise<HouseValueObject> {
return this.http
.get<HouseValueObject>(`${this.relativeURL}${houseNumber}/`)
.toPromise<HouseValueObject>();
}
Component:
async callHouseService(): Promise<void> {
this.houseData = await his.streetHouseService.getHouseData(this.houseNumber);
const keys = Object.keys(this.houseData.extensiveHouseData);
this.extensiveHouseDataList = keys.map(k => this.houseData.extensiveHouseData[k]);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/345442.html
