Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 是否首选可观察的?_Angular_Rxjs - Fatal编程技术网

Angular 是否首选可观察的?

Angular 是否首选可观察的?,angular,rxjs,Angular,Rxjs,考虑一个需要过滤数组的简单情况。在angular和rxjs的上下文中,我们可以使用JSfilter方法和rxjsfilter操作符 //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')).sub

考虑一个需要过滤数组的简单情况。在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观测值,特别是在角度内部工作(树摇晃等)的情况下。

像往常一样,这取决于你想要实现什么

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

如果处理组合,则可观察到的结果是好的

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

狗食器:

getAllDogs():可观察的->获取所有狗

getAllDogs(() => {
    http.get("/dogs/all");
})
getAllDogsWithColor(颜色:字符串)->订阅getAllDogs,然后使用颜色筛选列表

getAllDogsWithColor(color: String) = getAllDogs()
    .pipe(
        map(dog => dog),
        filter(dog => dog.color == color)
    )
getAllDogsWithColorAndFirstName(颜色:String,名字:String)->订阅 getAllDogsWithColor()和按名字筛选

getAllDogsWithColorAndFirstName(color: String, firstName:String) = getAllDogsWithColor(color)
    .pipe(
        filter(dog => dog.firstName == firstName)
    )
另一端的组件可以订阅它们,并在需要时对流执行其他各种操作


通常,订阅是通过异步管道进行的(智能组件通过“您的可观察的| async”管道传递可观察的,因此在使用属性之前,订阅就发生在该管道上。

尝试不带
过滤器的RXJS(甚至将过滤器反转为
x!=“2”
),您将看到,对数组中的每个元素调用subscribe一次,这通常不是您想要的。数组
过滤器
,和
可观察的
过滤器有不同的用途,这取决于您想要做什么。@Siddhartajmera绝对不是,这段代码处理的是假设的场景。代码审阅处理的是具体的代码在一个具体的上下文中。这个问题不适用。很抱歉。我最近开始使用CodeReview。我认为这是一个更好的问这个问题的地方。再次,很抱歉。我的错。假设
getAllDogs()
返回一个
可观察的
,那么我认为这是行不通的..过滤器无法访问
dog.color
,因为它被传递了一个
dog[]
。您必须将
map
与数组的
过滤器
功能结合使用。您是对的,刚刚编写了一些快速伪代码。我将改进示例。感谢您的评论,这些评论也不起作用:
map(dog=>dog)
实际上并没有做任何事情,它只是将数组转换为完全相同的数组。但关键是应该为该作业使用正确的函数。如果要筛选数组,请使用数组
过滤器
函数。如果要筛选事件(而不是事件值)从您的
Observable
,然后使用
Observable
s
filter
函数。对于像只发出1个值的HTTP请求这样的东西,
filter
是无意义的,我认为不是。实际上映射(dog=>dog)对数组项进行映射,并将数组映射到项。无论如何,这不是我回答中的重点,只是一个实现细节。事实并非如此。
map
函数用于转换值。从
map
返回的任何值都将成为新值。在这里,您只需使用
(dog=>dog)返回相同的值即可
。我的观点是,要在阵列上进行过滤,您必须使用阵列
过滤器
功能