【发布时间】:2019-02-01 13:57:24
【问题描述】:
我有一个对象需要填充我必须通过网络获取的信息。新信息应该存储在同一个对象中
例如:
const apps = {
com.foobar.bar: {
title:pancake,
existingInfo: bar
},
com.company.android: {
title: foobar,
existingInfo: barfoo
}
}
对于应用程序中的每个 id,我想调用一个 rest API,它会为我提供一些可以添加到对象的附加字段。 流不应该等待所有的 rest 调用完成,它应该从返回初始值开始,然后为它收到的每个 restcall 发出一个更新的对象。
第一次任何其他调用返回时,它应该只填充正确的字段。
{
com.foobar.bar: {
title:pancake,
existingInfo: bar,
newStuff: foobar //let say this is the response we get from the first restcall
},
com.company.android: {
title: foobar,
existingInfo: barfoo
}
}
更新: 我设法让代码工作,但我认为它也许可以以不同的方式完成。
const apps$ = of(apps).pipe(
mergeMap((apps:any) => { //**1**
const appPromise = Object.keys(apps).map((appId) => {
return fetchExternalAppInfo(appId).pipe(take(1));
})
appP.unshift(of(apps));
return of(appP).pipe(mergeAll())
}),
mergeAll(),
scan((acc, curr) => { //**2**
if (!acc) {
acc = curr;
} else {
acc[curr.appId] = Object.assign(acc[curr.appId], curr)
}
return acc
}, null),
map((result) => { //converting to an array which is ordered by title
return _.orderBy(result, 'title')
}),
)
** 1 = 这将返回一个 Observable 数组,该数组必须直接传递给 mergeAll()。这是订阅和合并 Observable 数组的正确方法吗
** 2 = 我知道传递给这个函数的第一个对象是我的初始值(appPromise.unshift(of(apps)))。这就是我可以保留旧的初始值并为其添加新值的方法。
* 更新 2 *
这是另一种解决方案,我认为这要好得多:这里我使用 combineLates 来编辑初始对象。
const fetchedApps$ = applist$.pipe(
mergeMap((apps:any) => { //*1
const appPromise = Object.keys(apps).map((appId) => {
return fetchExternalAppInfo(appId).pipe(take(1));
})
return of(appP).pipe(mergeAll())
}),
mergeAll(),
scan((acc, curr:any = {}) => {
acc[curr.appId] = curr;
return acc;
}, {}),
);
const apps$ = combineLatest(of(apps), fetchedApps$).pipe(
map(([a,b]) => {
return _.merge(a,b)
}),
map((result) => {
return _.orderBy(result, 'title')
}),
//*1 除了两次调用 mergeAll() 之外,还有其他方法可以“开始订阅”一组可观察对象吗?
【问题讨论】:
-
到目前为止您尝试过什么?请发布您尝试的代码。 StackOverflow 期待您try to solve your own problem first,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以说明您在Minimal, Complete, and Verifiable example 中遇到的具体问题。
-
@dmcgrandle 我现在更新了我的问题。
标签: javascript rxjs