GVKun编程网logo

Angular和rxjs – 我需要connect或refCount吗?(angular vs react)

15

对于Angular和rxjs–我需要connect或refCount吗?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解angularvsreact,并且为您提供关于.conn.Manage

对于Angular和rxjs – 我需要connect或refCount吗?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解angular vs react,并且为您提供关于.conn.ManagedClientConnectionImpl@604ed9f0 java.net.ConnectException: Connection refused: connect、Angular 2 / Rxjs:我真的需要取消订阅吗?、Angular 2:ngSwitch或ViewContainerRef.createComponent、angular – RxJs 6:从Observable获取ConnectableObservable的宝贵知识。

本文目录一览:

Angular和rxjs – 我需要connect或refCount吗?(angular vs react)

Angular和rxjs – 我需要connect或refCount吗?(angular vs react)

基本上,我昨天询问了重复使用来自可观察数据的数据,然后我也在其他地方询问并阅读更多内容然后我想,为什么不只是持有一个observable并使用map运算符操作数据.

所以我只做一个HTTP请求,将observable存储到某个变量并在那里操作它.代码有效,但我不确定我是否正确使用.publishReplay(1).refCount(),还是应该使用connect?或者,我甚至需要这些吗?此外,是否有任何可能的内存泄漏可能来自此服务?

这是服务代码:

@Injectable()
export class UsersApiService {

  private readonly baseUrl: string = 'https://reqres.in/api/users';
  resource$: Observable<any>;

  constructor(private http: HttpClient) {
    this.resource$= this.http.get<IUserDetails[]>(this.baseUrl).pipe(
      tap((data) => {
        console.log('"getUsers" successfully called!');
      }),map((data: any) => {
        return data.data;
      })
    ).publishReplay(1).refCount();
  }

  getUsers(): Observable<IUser[]> {
    return this.resource$.pipe(
      map((data: IUserDetails[]) => {
        return <IUser[]>data.map((u) => {
          return {
            id: u.id,name: `${u.first_name} ${u.last_name}`
          };
        });
      })
    );
  }

  getUserById(id: number): Observable<IUserDetails> {
    return this.resource$.pipe(
      map((data) => {
        return <IUserDetails>data.find(x => x.id === id);
      })
    );
  }

}

而工作示例:http://plnkr.co/edit/3S8iKbvrrGOj9netd8sM?p=preview

I’m not sure if I’m using .publishReplay(1).refCount() correctly

是的,你是.您也可以使用shareReplay(1).

or should I use connect?

当第一个订阅者出现时,refCount()已经为您连接(并且当所有观察者都取消订阅时断开连接).

do I even need any of that

如果你想把它作为一个可观察的,是的.否则,您将一遍又一遍地查询后端.但是,你当然也可以记住最后一次发射:

private resource: Observable<IUserDetails[]>;

constructor(http: HttpClient) {
    this.http.get(/* … */).subscribe(data => this.resource = data);
}

getUserById(id: number): IUserDetails {
    return this.resource.find(x => x.id === id);
}

Also,is there any possible memory leak that Could come out of this service?

不,因为HttpClient完成了它的返回observable,这意味着你的多播observable的源被断开了.

.conn.ManagedClientConnectionImpl@604ed9f0 java.net.ConnectException: Connection refused: connect

.conn.ManagedClientConnectionImpl@604ed9f0 java.net.ConnectException: Connection refused: connect

DEBUG 2016-11-07 14:32:47,518  Get connection for route {}->http://127.0.0.1:8087->http://rdsearch.zhaopin.com:80
DEBUG 2016-11-07 14:32:47,519  Connecting to 127.0.0.1:8087
DEBUG 2016-11-07 14:32:48,530  Connection org.apache.http.impl.conn.DefaultClientConnection@91161c7 closed
DEBUG 2016-11-07 14:32:48,531  Connection org.apache.http.impl.conn.DefaultClientConnection@91161c7 shut down
DEBUG 2016-11-07 14:32:48,532  Releasing connection org.apache.http.impl.conn.ManagedClientConnectionImpl@604ed9f0
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:117)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)

Angular 2 / Rxjs:我真的需要取消订阅吗?

Angular 2 / Rxjs:我真的需要取消订阅吗?

我知道我必须在销毁组件时取消订阅某些Observable(即:具有无限值的Observable)以防止内存泄漏.对于有限的Observables,我不需要这样做,因为它们将完成并自动取消订阅.

但是如果我在我的组件中创建一个无限的Observable(例如FormGroup.valueChanges或QueryList.changes),那么这个将被包含它的组件销毁,所以我认为即使我不这样做它们也不会有内存泄漏取消订阅.

这是一个简单的例子:

@Component({})
export class DummyComponent {
    form: FormGroup;

    constructor(private fb: FormBuilder) {
        this.form = this.fb.group({
            firstName: [''],lastName: ['']
        });
        this.form.valueChanges.subscribe(
            x => console.log(x)
        );
    }
}

在这里,我没有取消订阅this.form.valueChanges;当我的组件被销毁时,this.form.valueChanges也将被销毁.

在这种情况下是否会出现内存泄漏?

正如Babar所提到的,您需要进行取消订阅才能阻止这些订阅继续观看更改.

对于你的特殊情况,我认为你有一个观点.

当我在同一组件中有大量订阅时,我做的一件事如下.

首先,我创建“订阅”,一个空的订阅类型数组.

private subscriptions: Subscription[] = [];

然后,每次我需要订阅时,我将它推入数组

this.subscriptions.push(this.form.valueChanges.subscribe(x => console.log(x)));

在ngOnDestroy中,我取消订阅数组中的每个订阅.

ngOnDestroy(): void {
  this.subscriptions.forEach((elem) => { elem.unsubscribe(); })
}

Angular 2:ngSwitch或ViewContainerRef.createComponent

Angular 2:ngSwitch或ViewContainerRef.createComponent

我有一个案例,我在列表中动态创建组件(刷新很多)并使用像这样的ngSwitch:

<div *ngFor='let item of items'>
   <div [ngSwitch]="item.view">
        <view-one *ngSwitchCase="'one'"></view-one>
        <view-two *ngSwitchCase="'two'"></view-two>
        <view-three *ngSwitchCase="'three'"></view-three>
    </div>
</div>

我想知道是否有更好的更有效的方法,或者这是正确的方法吗?

我见过人们动态创建组件,但api已经改变了很多次,很难知道什么是正确的.似乎ViewContainerRef.createComponent()可能是另一种选择?

解决方法

我更喜欢createComponent()而不是ngSwitch,因为我认为它更容易测试和扩展.我还没有看到任何表现不足.

这是我当前方法的简化形式:

@Component({
    selector: "my-item",template: `
        <div #placeholder></div>
    `
})
export class MyItemComponent implements AfterViewInit {
    @input() item: any;
    @ViewChild("placeholder",{read: ViewContainerRef}) placeholderRef: ViewContainerRef;

    constructor(
        private componentFactoryResolver: ComponentFactoryResolver) {
    }

    ngAfterViewInit() {
        switch(this.item.view) {
            case "one":
                this.loadItem(OneItemComponent);
            case "two":
                this.loadItem(TwoItemComponent);
            default:
                throw new Error("UnkNown item!");
        }
    }

    private loadItem(component: Type<any>) {
        const factory = this.componentFactoryResolver.resolveComponentFactory(component);
        const componentRef = this.placeholderRef.createComponent(factory);
        componentRef.instance.item = this.item;
        componentRef.changeDetectorRef.detectChanges();
    }
}

现在您可以通过以下方式使用它:

<my-item *ngFor="let item of items" [item]="item"></my-item>

angular – RxJs 6:从Observable获取ConnectableObservable

angular – RxJs 6:从Observable获取ConnectableObservable

Angular 6需要更新RxJs 6并且使用RxJs更新Observable.publish()函数消失了.我在RxJs /运算符中找到了一个发布运算符,但是我无法弄清楚如何使用它.

如何重写这个RxJs 5代码以使用RxJs 6?

const myConnectableObservable = this.getobservable().publish()

解决方法

import { ConnectableObservable } from "rxjs"
import { publish } from "rxjs/operators";

const myConnectableObservable: ConnectableObservable<MyClass> = myService.getobservable().pipe(publish()) as ConnectableObservable<MyClass>;

特别感谢@cartant

今天的关于Angular和rxjs – 我需要connect或refCount吗?angular vs react的分享已经结束,谢谢您的关注,如果想了解更多关于.conn.ManagedClientConnectionImpl@604ed9f0 java.net.ConnectException: Connection refused: connect、Angular 2 / Rxjs:我真的需要取消订阅吗?、Angular 2:ngSwitch或ViewContainerRef.createComponent、angular – RxJs 6:从Observable获取ConnectableObservable的相关知识,请在本站进行查询。

本文标签: