angular - RxJS 重构嵌套 map 语句

标签 angular refactoring rxjs code-cleanup rxjs5

我有一项服务使用 @angular/http 从 API 加载数据。 我想使用此数据为我的 Components 创建检索数据的投影。

因此我写了下面的代码:

getById(id: string) {
  return this.http
    .get(`https://my-api.io/${id}`)
    .map(response => response.json())
    .map(contracts =>
      contracts.map(contract =>        # <- Nested map
        new Contract(
          contract['id'],
          contract['description']
        )
      )
    );
}

6th 行中,我有一个嵌套的 map - 语句降低了我的代码的可读性。

问题

我可以做得更好吗?我可以使用 RxJS 中的运算符来代替创建这种嵌套吗?

提前致谢!

最佳答案

我建议使用 flatMap/selectMany将嵌套数组展平为每个单个数组元素的新流。在下一步中,您可以使用 RxJS.map() 进行实际映射。最后使用 RxJS.toArray() 将所有映射的数组元素收集到一个提供单个数组事件的新可观察对象中:

const stream = $http('http://jsonplaceholder.typicode.com/posts')
 .map(res => res.data)
 .flatMap(posts => posts)
 .map(post => Object.assign({}, post, { status: false }))
 .toArray();

请在此处查看示例:http://jsbin.com/vigizihiwu/1/edit?js,console

但我也会考虑:这样做真的有必要吗?如果您只有一个订阅者,请将接收到的数组映射到那里:

const stream = $http('http://jsonplaceholder.typicode.com/posts')
 .map(res => res.data);

stream.subscribe(res => {
  const posts = res.map(post => Object.assign({}, post, { status: false }));
  console.log(posts);
});

关于angular - RxJS 重构嵌套 map 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40170157/

相关文章:

angular - 如何在 ThingsBoard 小部件中创建和使用 Angular 组件

angular - 无法在 CanDeactivate 路由器防护中获取下一个状态(下一个 url)

angular - 如何通过 Angular 2中的post请求编辑后获取更新的数据

javascript - JavaScript 中的函数式响应式(Reactive)编程是否会导致更大的监听器引用问题?

node.js - 如何将 RxJs observable 的结果作为 Node.js 的剩余响应返回

Angular2 - ngFor 指令不映射已删除的项目

Angular Material Button 和 RxJS fromEvent 函数 - 没有 nativeElement 属性,只有 _nativeElement 属性

c# - 想要使这个许可系统通用以减少重复代码等

c++ - 如何在 Visual Studio 2012 中用 C++11 替换所有 BOOST_FOREACH?

javascript - 有没有更干净的方式来链接这些 Bluebird promise ?