首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RxJS -收集异步操作结果

RxJS -收集异步操作结果
EN

Stack Overflow用户
提问于 2016-09-06 16:29:12
回答 1查看 816关注 0票数 0

我希望对数组的每个元素执行异步操作,并在字典中收集其结果。我目前的做法是:

代码语言:javascript
运行
复制
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));
代码语言:javascript
运行
复制
<script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.7/dist/global/Rx.umd.js"></script>

基本上,这像我想要的那样工作,但它似乎是RxJs操作符的一个笨拙的用法。因此,我需要以下方面的帮助:

  1. 避免数据突变(尝试使用扫描(),但不知道如何在这里使用它。有一个mergeScan()方法,但这里是相同的)
  2. 是否可以简化takeLast和take -的使用?

我想我缺少了一个RxJS操作符,它帮助我简化了这个过程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-06 23:19:12

要“对数组的每个元素执行异步操作并在字典中收集其结果”,可以使用mergeMapreduce函数对代码进行显著简化:

代码语言:javascript
运行
复制
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); });
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39353780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档