我已经使用RxJS编写了可以工作的代码:
from(dateQuery.first())
.subscribe((result) => {
query.greaterThanOrEqualTo('createdAt', result.createdAt);
const dateFormat = moment(result.createdAt).format('DD/MM/YYYY - HH:mm:ss');
from(query.find())
.map(el => el.map((e) => {
return {
id: e.id,
username: e.get('username')
}
}))
.mergeMap((array) => Observable.of({
names: array,
lastUpdate: dateFormat
}))
.subscribe(
(next) => res.send(serialize(next)),
(error) => res.send(serialize(error)),
() => console.log('completed'));
},
(error) => console.log(error)
);
我的问题:是否可以仅创建一个订阅而不是两个?因为之前我还需要在另一个mergeMap中使用第一个订阅的结果,并且如果我只尝试执行一个订阅,我也不知道如何存储它。
谢谢您的帮助。
答案 0 :(得分:0)
您可以做类似的事情
from(dateQuery.first()).pipe(
tap(() => query.greaterThanOrEqualTo('createdAt', result.createdAt)),
map(result => moment(result.createdAt).format('DD/MM/YYYY - HH:mm:ss')),
mergeMap(dateFormat => from(query.find()).pipe(
map(el => el.map((e) => ({
id: e.id,
username: e.get('username')
}))),
mergeMap((array) => Observable.of({
names: array,
lastUpdate: dateFormat
})),
tap(() => res.send(serialize(next))),
catchError(error => of('Find error'))
))
).subscribe();
答案 1 :(得分:0)
根据我的理解,这是我的第一个想法。
我已将第一个订阅导出到一个可观察的对象中,并重用它来构造第二个可观察对象(find$
),在该对象中进行第二个订阅。
我不知道query.greaterThanOrEqualTo('createdAt', result.createdAt)
的作用,因此我将其放在.do()
运算符中作为副作用。如果需要在执行其余代码之前执行此方法,请从中返回一个observable或promise并使用mergeMap。
const dataQueryFirst$ = dateQuery.first();
const find$ = dataQueryFirst$
.do((result) => query.greaterThanOrEqualTo('createdAt', result.createdAt))
.mergeMap(result => {
const dateFormat = moment(result.createdAt).format('DD/MM/YYYY - HH:mm:ss');
return from(query.find())
.map(el => el.map((e) => {
return {
id: e.id,
username: e.get('username')
}}))
.mergeMap((array) => Observable.of({
names: array,
lastUpdate: dateFormat
}))
});
find$.subscribe(
(next) => res.send(serialize(next)),
(error) => res.send(serialize(error)),
() => console.log('completed')
);
答案 2 :(得分:0)
我将使用“ switchMap”实现它。 另外,我会在函数中提取一些逻辑以使其更具可读性。从v5.5开始,我更喜欢rxjs的新“管道”方式。
importer --file
热烈的问候