Angular中的管道与订阅者的区别

12

希望大家都过得好。请问有人可以清楚地解释一下,pipesubscribe之间在选择时应该如何考虑?为什么?不仅要获取响应,还需要初始化其他变量或更改布尔变量。

同时,请看一下代码。这是正确的做法吗?

public getAlbums(){
    this.enableLoader = false;
    this.albumHttpService.getAlbums()
        .pipe(
            map((response) => {
                this.enableLoader = false;
                if (!response.albums.length) {
                    this.noDataSet = true;
                    if (response.albums === null) {
                        this.list = [];
                    }
                }
                else{
                    this.noDataSet = false;
                    this.list = response.albums;
                }
            }),
            catchError((error) => {
                this.noDataSet = false;
                this.data = [];
                throw new Error(error);
            }) 
        )
        .subscribe();
}

感谢您的提前帮助。

它们彼此完全不同,就像比较橙子和苹果一样。pipe允许您链接多个rxjs操作符,而subscribe则如其名称所示从可观察对象中检索数据。 - Nicholas K
2个回答

20

管道基本上将函数的输出作为输入传递给另一个函数。这是一种非常出色且高效的操作数据的方法,非常强大。

我们基本上将某些东西的输出导入到可以修改传入数据的不同函数中,或者在数据之上添加额外的逻辑(触发副作用)。

我们可以在管道运算符中链接多个逻辑。

订阅被称为在可观测对象上调用以订阅从可观测对象推送出的最终数据。

快速示例:我有一个可观测对象,它发送一个字符串“World”。

worldObservable$.pipe(
  tap(data=>console.log(data)), // Prints "World"
  map(data=> `Hello ${data}`)
)
.subscribe(data=>console.log(data)); // Prints "Hello World"
在这个例子中,首先我使用tap来获取数据并记录它。 接下来,我使用map运算符修改数据,改变了初始数据。 当我订阅时,记录的是修改后的数据,而不是初始数据。
我希望它给您带来了更多的清晰度。

1
请纠正我,但我认为这个答案中重要的词是“副作用”。如果你只想从你的可观察对象中获取信息,你可以订阅它;如果你想在订阅之前对其进行操作(副作用),你需要插入一个管道并使用任何允许的运算符函数。这样说对吗? - Scala Enthusiast

11

pipe 可以串联多个其他函数,使用这些函数来编写一些逻辑、为视图准备数据等。

subscribe 类似于最后一个点,在那里您可以准备好数据,最好不要在那里编写任何逻辑,只需将其分配给您的视图模型等即可。


谢谢。这里有一个快速问题,如果我理解正确的话,那么上面的代码片段是正确的,逻辑会进入管道函数。对吗? - unknown user
@unknownuser 是的,这很好。但是你还需要考虑一个事实,那就是你调用了一个额外的函数。因此,如果你有很多项,它可能会延迟你。 - Suren Srapyan
@SurenSrapyan,您能解释一下为什么在pipe中使用逻辑更好吗?有什么好处?为什么不直接订阅原始可观察对象并在那里进行更改和分配呢? - N4ppeL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接