提问者:小点点

在Angular的超文本传输协议中使用rxjs()


假设我在提供程序中有一个这样的函数:

getAll(): Observable<CarModel[]> {
    return this.http.get<CarModel[]>(this.carUrl);
}

在一个组件中,我有一个函数使用提供者的这个函数:

getCars() {
        const that = this;
        this.carService.getAll().subscribe(function(cars) {
            that.factoryService.setCars(cars);
            this.unsubscribe();
        });
    }

可以用使用采取运算符的函数替换它以避免调用取消订阅()吗?

getCars() {
        const that = this;
        this.carService.getAll().take(1).subscribe(function(cars) {
            that.factoryService.setCars(cars);
        });
    }

我想知道当与Angular的Httpclient方法一起使用时,这是否会有任何意外或不需要的行为?我从未见过Angular的Httpclient这样使用-这就是我问的原因。


共2个答案

匿名用户

HttpClient在请求完成后调用流上的完成。调用完成的可观察信号表示不会发出更多值,因此任何订阅者都不会收到更多值。这意味着没有理由取消订阅或在超文本传输协议请求中使用采取

getAll(): Observable<CarModel[]> {
  return this.http.get<CarModel[]>(this.carUrl); // <- Emits once and completes
}

从文档中查看此部分。注意:

来自HttpClient的可观察对象总是发出一个值,然后完成,永远不会再次发出。

匿名用户

作为你,我以前从未见过这样的。

我曾经将所有超文本传输协议请求转换为Promise:

在MDN站点中,您可以找到以下内容:Promise对象表示异步操作的最终完成(或失败)及其结果值。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

this.carService.getAll()
        .toPromise()
        .then((cars) => {
            that.factoryService.setCars(cars);
        }).catch((error) => {
            console.error(error);
        });