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