首页 > 解决方案 > 在订阅内订阅维护订单

问题描述

下面的编码在订阅中订阅。它获取一个 schedule_id 并根据 schedule_id 检索问题。这完美地工作,但getQuestion()不能保证的顺序。

schedule_id#:111、222、333、444

getQuestion(schedule_id) 输出#:q1(222)、q23(111)、q12(444)、q15(333)

但它应该是#: q23(111), q1(222), q15(333), q12(444)

我需要getQuestion()按照schedule_ids的顺序执行,等一个进程完成再进行下一个。可以在这里使用forkJoin()吗?

const source = from(res.data);
source.pipe(map(({ schedule_id }) => schedule_id))
  .pipe(mergeMap(schedule_id => {
    let param = {
      "schedule_id": schedule_id
    }
    console.log("schedule_id#: ", schedule_id);
    return this.fetchApiService.getQuestion(param);
  }))
  .subscribe((result) => {
    console.log('result#:', result);
  })

标签: angulartypescriptrxjs

解决方案


ConcatMap 对我来说很好用。当然,使用 concatMap,在前一个 observable 完成之前,您永远不会开始下一个 observable(这就是您维持秩序的方式)。如果你给它一个永远不会完成的 observable,你最终会出现轻微的内存泄漏,没有别的。

如果我把你的代码做成一个合法的可观察的,它对我有用。

  myConcatMapFunc(){
    let schedule_ids = from(['111','222','333','444']);
    schedule_ids.pipe(
      concatMap(data => {

        let param = {
          "schedule_id": data,
        }

        console.log('schedule_id#', data);

        return new Observable(subscriber => {
          subscriber.next('Q1');
          subscriber.next('Q2');
          subscriber.next('Q3');
          subscriber.complete();
          return { unsubscribe: () => {} };
        });

      })
    ).subscribe(result => {
      console.log('result#', result);
    })
  }

推荐阅读