如何仅创建此代码的一个subscription()

时间:2018-07-04 15:38:34

标签: javascript rxjs observable

我已经使用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中使用第一个订阅的结果,并且如果我只尝试执行一个订阅,我也不知道如何存储它。

谢谢您的帮助。

3 个答案:

答案 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

热烈的问候