在维护订单的订阅内订阅

时间:2021-06-17 01:32:10

标签: angular typescript rxjs

下面的代码已经在订阅里面订阅了。它获取 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)

我需要按照schedule_ids的顺序执行getQuestion(),等待一个进程完成后再进行下一个。 可以在这里使用 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);
  })

2 个答案:

答案 0 :(得分:1)

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);
    })
  }

答案 1 :(得分:0)

操作符 concatMap() 在开始下一个 observable 之前等待前一个内部 observable 完成,而 mergeMap() 同时处理多个内部 observable,不保证顺序。

试试这个:

const source = from(res.data);
source.pipe(map(({ schedule_id }) => schedule_id))
  .pipe(concatMap(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);
  })