angular - 在订阅内订阅维护订单
问题描述
下面的编码在订阅中订阅。它获取一个 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);
})
解决方案
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);
})
}
推荐阅读
- openstreetmap - 如何为搜索指定 admin_level?
- python - 添加新后如何在托盘菜单中刷新
- c++ - 如何修改字符串预构建
- windows - 分配变量后,无法将尾部数据从日志文件打印到 PowerShell 控制台
- node.js - 基于Node JS中的响应主体重试请求
- node.js - 如何在谷歌云函数中使用 JSON 配置文件
- angular - 在现有 Angular 应用程序上添加 Nrwl Nx 后 ng g 应用程序将应用程序添加到错误的目录中
- python - Tensorflow > ModuleNotFoundError:没有名为“tensorflow.contrib”的模块
- node.js - 如何在没有 express 的情况下获取节点 graphql 解析器的标头?
- git - 来自其他人的更改显示为 git pull 后未暂存提交的更改