انگولار - نگاشت Observable به آرایهای از اشیاء
من REST API دارم که آرایه json را با داده برمی گرداند. در سمت کلاینت از این کد برای ایجاد اشیاء از درخواست استفاده می کنم.
public getNews(): Observable<News[]> {
return this.http.get(this.baseUrl + '/news')
.pipe(
catchError(this.handleError('getNews', []))
)
.map(res => {
let response: any = res;
return response.map((item) => new News(item));
});
}
مشترک شدن :
this.restProvider.getNews().subscribe((news: News[]) => {
this.news = news;
});
اما چگونه میتوانم مشکل را حل کنم وقتی پاسخ یک آرایه نیست بلکه تنها یک عنصر است؟ یا پاسخ اشتباه است مانند داده غیرمنتظره از API؟
در حال حاضر در این موقعیتها برنامه من این خطا را نمایش میدهد:
response.map یک تابع نیست
پاسخ #۱
کد زیر باید به شما در مدیریت خطاها کمک کند:
this.restProvider.getNews().subscribe((news: News[]) => {
this.news = news;
}, (err) => {
console.log(err);
});
فقط کافی است پارامتر خطا را در تابع اشتراک اضافه کنید.
حالا میرسیم به اولین سوال شما: اگر پاسخ یک شیء منفرد باشد چه میشود؟ -> امضای تابع همیشه آن را مجبور میکند که یک آرایه بازگرداند. خطا در سمت اشتراک تولید خواهد شد. یک راه حل ساده برای این موضوع تغییر نوع داده پاسخ است.
this.restProvider.getNews().subscribe((news:any) => {
this.news = news;
});
پاسخ شماره ۲
کد همیشه آرایه را برمیگرداند:
public getNews(): Observable<News[]> {
return this.http.get(this.baseUrl + '/news')
.pipe(
catchError(this.handleError('getNews', []))
)
.map(res => {
if(Array.isArray(res)) {
return res.map((item) => new News(item));
} else {
return [new News(res)];
}
});
}
