rxjs - 您如何执行 Observables API 调用数组,其中每个 API 调用都等待前一个?
问题描述
我一直在玩的是使用 combineLatest 和 concatAll() 但它们仍然被同时调用。我可以循环并调用每个,但我总是想知道在 RXJS 工作流程中是否有更好的方法。
combineLatest(arrayOfApiObservables).pipe(concatAll()).subscribe();
解决方案
这里的问题是你使用了combineLatest
操作符,它只会在所有的 observables 都发出后才会发出值(例如它同时调用所有东西)。
在那之后concatAll
不能影响他们,arrayOfApiObservables
因为他们已经被叫了。
正确的方法是创建一个高阶 observable(发出 observables 的 observable),这可以在 operator 的帮助下实现from
,然后你可以concatAll
让他们实现所需的结果。
concatAll
文档中看到的定义: Converts a higher-order Observable into a first-order Observable by concatenating the inner Observables in order.
.
let {
interval,
from
} = rxjs
let {
take,
concatAll,
mapTo
} = rxjs.operators
let ref = document.querySelector('#container')
const obs1$ = interval(1000).pipe(take(1), mapTo('obs1'));
const obs2$ = interval(500).pipe(take(1), mapTo('obs2'));
const obs3$ = interval(2000).pipe(take(1), mapTo('obs3'));
let allObservables$ = from([obs1$, obs2$, obs3$])
allObservables$.pipe(
concatAll()
).subscribe((x) => {
console.log(x)
container.innerHTML += `<div>${x}</div>`
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.js"></script>
<div id="container"></div>
推荐阅读
- sql-server - MSSQL BCP 链接服务器
- jquery - 在使用区填充块之前添加一个空值,等等使用 Ajax
- bash - 如何使用 bash 在 docker 容器中获取僵尸进程
- java - android检查URL是否包含来自数组的站点名称总是返回false
- javascript - 如何有效地形成具有 2 个数组的对象
- c++ - C++ 11 中与 std::atomic 的同步
- css - Bootstrap 排版显示字体类在我的本地 Web 开发环境中呈现不同的文本大小
- sql - 查询在瑞士获得计数至少为 1 的名称
- python - 在 Webhook 中将字节转换为字符串的问题 - LoggerDebug - Python3
- scip - 如何在每个节点收集scip提供的分支规则的分支过程数据