Застрял на этой проблеме на некоторое время. Чего я пытаюсь добиться, так это заменить идентификаторы продуктов на http-ответ от API.
Ответ appConfig (упрощенный)
[
{
...,
hotspot: [
{
...,
data: {
...,
products: [1234, 5678]
}
},
{
...,
data: {
...,
products: [8910, 1112]
}
}
]
}
]
Код, который я сейчас использую (действительно простой на данный момент).
public readonly loadAppConfig$ = this._retailerSrv.retailer$.pipe(
filter((retailer) => Boolean(retailer)),
switchMap((retailer) =>
combineLatest([
of(retailer),
this._roomConfigSrv.loadAppConfig$(),
this._authSrv.getApiKey$(retailer),
])
),
map(([retailer, appConfigs, authResponse]) => {
return appConfigs.map((appConfig) => {
this._authSrv.apiKey = authResponse.access_token;
return {
...appConfig,
hotspots: appConfig.hotspots.map((hotspotConfig) => {
if (
hotspotConfig.type === 'products' &&
hotspotConfig.data.products
) {
return {
...hotspotConfig,
data: hotspotConfig.data.products.map((productId) =>
this._authSrv.getProductFromApi$(
productId,
retailer
)
),
};
}
return {
...hotspotConfig,
};
}),
};
});
}),
tap(console.info)
);
Что в основном возвращает меня с наблюдаемыми http вместо идентификаторов продукта (а не ответов API).
Результат от крана
[
{
...,
hotspot: [
{
...,
data: {
...,
products: [Observable, Observable]
}
},
{
...,
data: {
...,
products: [Observable, Observable]
}
}
]
}
]
Я знаю, что есть более простой способ добиться этого, но я пока ничего не нашел (пробовал обещания и т. д.). Любая помощь будет высоко оценена, и, пожалуйста, дайте мне знать, если у вас есть другие вопросы.
Ваше здоровье
ваш код не дает никакого представления о вашем .json и о том, что вы хотите его получить, но идея всегда одна и та же
В псевдокоде использовать как «вдохновение»
loadAppConfig.pipe(
switchMap(configData=>{
..here we has config..
let products=[]; //we create an array with the products
configData.hotspot.forEach(x=>{
products=[...products,x.data.products] //we fill the array "products"
})
return forkJoin(products.map(p=>loadProduct(p)).pipe( //we create an array of observables
map(productResult=>{
..here change the "config" that is store in "configData"...
..using "productResult"...,e.g.
configData.hotsport.forEach(x=>{
const product=productResult.find(x=>p.key==x.data.product
x.data.productData=product
})
...finally...
return configData
}
)
}
))