RxJS -收集异步操作结果
RxJS - Collect async operation results
我想对数组的每个元素执行异步操作,并在字典中收集其结果。我目前的方法是:
let asyncOp = () => Rx.Observable.interval(300).take(1);
let dict = {};
Rx.Observable.from(['a', 'b'])
.mergeMap(el => asyncOp()
.map(asyncOpRes => dict[el] = asyncOpRes)
.do(state => console.log('dict state: ', dict))
)
.takeLast(2)
.take(1)
.map(() => dict)
.subscribe(res => console.log('dict result: ', res));
<script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.7/dist/global/Rx.umd.js"></script>
基本上这是我想要的,但它似乎是一个尴尬的使用RxJs操作符。所以我需要以下帮助:
- 避免字典突变(尝试使用scan(),但不知道如何在这里使用它。有一个mergeScan()方法,但这里相同)
- takeLast和take -的使用应该可以简化吗?
我想我错过了一个RxJS操作符,它可以帮助我简化这个
要"对数组的每个元素执行异步操作并在字典中收集其结果",可以使用mergeMap
和reduce
函数大大简化代码:
import * as Rx from "rxjs/Rx";
const asyncOp = () => Rx.Observable.interval(300).take(1);
Rx.Observable.from(["a", "b"])
// Perform the async operation on the values emitted from the
// observable and map the emitted value and async result into
// an object.
.mergeMap((key) => asyncOp().map((result) => ({ key, result })))
// Use reduce to build an object containing the emitted values
// (the keys) and the async results.
.reduce((acc, value) => { acc[value.key] = value.result; return acc; }, {})
.subscribe((value) => { console.log(value); });
相关文章:
- 如何指示“;熟度;在异步操作中
- 使用jquery更改异步操作中的文本值
- 节点.js中的嵌套异步操作
- 阻止chrome.webRequest.onBeforeSendHeaders侦听器中的异步操作
- 节点.js和表达式:如何在异步操作后返回响应
- 无法在Redux中测试异步操作
- 当我在异步操作Redux上开始单元测试时,没有定义错误承诺
- 循环中的异步操作
- 回流如何侦听异步操作已完成
- 我们可以使用Jasmine在测试中执行异步操作吗
- jQuery:如何检查以确保所有异步操作都已完成
- JavaScript ES6 承诺在 while 循环中调用异步操作
- 请等待异步操作 (firebase) 调用完成,然后再加载网页
- 具有 Javascript 同步接口的异步操作
- 如何在异步操作期间使 Express.js 日志错误
- 如何在 $ 中执行异步操作.延迟,然后失败过滤回调并传递回成功链
- 如何将复选框的值传递给 MVC5 中的操作结果
- 如何查找选中的复选框并将其传递给 MVC 中的操作结果
- Redux 中的异步操作
- RxJS -收集异步操作结果