【问题标题】:Are observables preferred?可观察对象是首选吗?
【发布时间】:2018-08-28 01:29:24
【问题描述】:

考虑一个需要过滤数组的简单情况。在 Angular 和 rxjs 的上下文中,我们可以同时使用 JS filter 方法和 RxJS filter 运算符。

//JS filter
let array = ['1', '2', '3', '4']
let result = array.filter(x => x == '2')[0];

//RXJS filter
const p = from(array);
let result: any;
p.pipe(filter(x => x == '2')).subscribe(x => { result = x; });

是否存在一种方法优于另一种方法的情况?我是否应该尽可能多地尝试处理 rxjs 可观察对象,尤其是在有角度的内部工作(摇树等)的情况下?

【问题讨论】:

  • 尝试不带filter 的RXJS(或者甚至将过滤器反转为x != '2'),您会看到数组中的每个元素都调用了一次订阅,即往往不是你想要的。数组filterObservable 过滤器有不同的用途,具体取决于您要执行的操作。
  • @SiddharthAjmera 绝对不是,这段代码处理的是假设场景。代码审查处理具体上下文中的具体代码。此问题不适用。
  • 很抱歉。我最近开始使用 CodeReview。我认为那将是一个更好的地方来问这个问题。再次,对此感到抱歉。我的错。

标签: angular rxjs


【解决方案1】:

像往常一样,取决于您想要实现的目标。

对于一个非常简单的案例(特定组件只需要在一个地方),我相信它在性能方面没有太大区别。

如果处理compose,Observables 是很好的。

假设您有一个服务女巫通过 API 获取一些数据(我们称之为“DogsAPI)”

DogsAPI 服务:

getAllDogs(): Observable -> 获取所有狗

getAllDogs(() => {
    http.get("/dogs/all");
})

getAllDogsWithColor(color: String) -> 订阅getAllDogs,然后用颜色过滤列表

getAllDogsWithColor(color: String) = getAllDogs()
    .pipe(
        map(dog => dog),
        filter(dog => dog.color == color)
    )

getAllDogsWithColorAndFirstName(color: String, firstName:String) -> 订阅 getAllDogsWithColor() 并按名字过滤

getAllDogsWithColorAndFirstName(color: String, firstName:String) = getAllDogsWithColor(color)
    .pipe(
        filter(dog => dog.firstName == firstName)
    )

如果需要,另一端的组件可以订阅它们并对流进行其他各种操作。

通常订阅是通过异步管道发生的(智能组件通过“your observable | async”管道传递可观察对象,因此订阅在属性被使用之前就发生在那里。

【讨论】:

  • 假设getAllDogs() 返回Observable<Dog[]>,那么我不相信这会起作用.. 过滤器无权访问dog.color,因为它被传递了Dog[]。您必须将 map 与数组的 filter 函数结合使用
  • 你是对的,只是写了一些快速的伪代码。我会改进这个例子。感谢您的评论
  • 这也行不通:map(dog => dog) 实际上并没有做任何事情,它将数组转换为完全相同的数组。但关键是应该为这项工作使用正确的功能。如果要过滤数组,请使用数组filter 函数。如果您想从Observable 中过滤事件(而不是事件值),请使用Observables filter 函数。对于像只发出 1 个值的 HTTP 请求,filter 毫无意义
  • 我认为不会。实际上 map(dog => dog) 对数组项进行映射并将数组映射到项。无论如何,这不是我回答的重点,只是一个实现细节
  • 确实没有。 map 函数用于转换值。从map 返回的任何内容都将成为新值。在这里,您只是返回与(dog => dog) 相同的值。我的意思是,要过滤数组,你必须使用数组 filter 函数
猜你喜欢
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多