rxjs Observable 合并没有按预期工作
rxjs Observable merge doesn't work as expected
我需要为 POST 请求生成此结果:
{
"names": [
{
"id": "t3xcb9xAyX",
"username": "Gennaro"
},
{
"id": "Csdu65RKon",
"username": "Marco"
},
...
],
"createdAt":"04/07/2018 - 11.49.51"
}
所以我使用 rxjs 完成了这项工作:我创建了两个 Observable(一个用于名称,一个用于 createdAt)并在最后合并:
const notObj = utils.getNotificationType(codeProduct, Parse);
const csvObj = utils.getNotificationType(codeProduct, Parse);
const query = new Parse.Query(notObj);
const dateQuery = new Parse.Query(csvObj).descending('createdAt');
const names = from(query.find())
.map(el => el.map((e) => {
return {
id: e.id,
username: e.get('username')
}
}))
.mergeMap((arr) => Observable.of({
names: arr
}));
const lastUpdate = from(dateQuery.first())
.map(res => moment(res.createdAt).format('DD/MM/YYYY - HH:mm:ss'))
.map(res => {
return {
createdAt: res
}
});
merge(names, lastUpdate)
.subscribe(
(data) => res.send(serialize(data)),
(error) => res.send(serialize(error)),
() => console.log('complete')
);
问题是最终合并只检索到我 "names"
。我可以使用 .zip()
运算符得到另一个结果,但我有一个 JSON 数组而不是一个对象。
我的问题是:为什么 merge()
不合并两个结果而只合并第一个?谢谢
那不是 merge
所做的。它合并 Observable 流而不是对象本身。使用 forkJoin
代替,它将发出一组结果,然后自己将其与 map
:
合并
const names$ = ...;
const lastUpdate$ = ...;
forkJoin(names$, lastUpdate$)
.map(([ names, lastUpdate ]) => ({ names, lastUpdate }))
.subscribe(...)
我需要为 POST 请求生成此结果:
{
"names": [
{
"id": "t3xcb9xAyX",
"username": "Gennaro"
},
{
"id": "Csdu65RKon",
"username": "Marco"
},
...
],
"createdAt":"04/07/2018 - 11.49.51"
}
所以我使用 rxjs 完成了这项工作:我创建了两个 Observable(一个用于名称,一个用于 createdAt)并在最后合并:
const notObj = utils.getNotificationType(codeProduct, Parse);
const csvObj = utils.getNotificationType(codeProduct, Parse);
const query = new Parse.Query(notObj);
const dateQuery = new Parse.Query(csvObj).descending('createdAt');
const names = from(query.find())
.map(el => el.map((e) => {
return {
id: e.id,
username: e.get('username')
}
}))
.mergeMap((arr) => Observable.of({
names: arr
}));
const lastUpdate = from(dateQuery.first())
.map(res => moment(res.createdAt).format('DD/MM/YYYY - HH:mm:ss'))
.map(res => {
return {
createdAt: res
}
});
merge(names, lastUpdate)
.subscribe(
(data) => res.send(serialize(data)),
(error) => res.send(serialize(error)),
() => console.log('complete')
);
问题是最终合并只检索到我 "names"
。我可以使用 .zip()
运算符得到另一个结果,但我有一个 JSON 数组而不是一个对象。
我的问题是:为什么 merge()
不合并两个结果而只合并第一个?谢谢
那不是 merge
所做的。它合并 Observable 流而不是对象本身。使用 forkJoin
代替,它将发出一组结果,然后自己将其与 map
:
const names$ = ...;
const lastUpdate$ = ...;
forkJoin(names$, lastUpdate$)
.map(([ names, lastUpdate ]) => ({ names, lastUpdate }))
.subscribe(...)