当前位置: 首页 > 知识库问答 >
问题:

角5订阅和退订可观察

华坚成
2023-03-14

我必须从两个订阅服务器获取数据,但我总是获取第一个订阅服务器的数据。

我有一个数据共享服务:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';


@Injectable()
export class DataService {

    private source = new BehaviorSubject<any>('');
    data = this.source.asObservable();

    constructor() { }

    update(values: any) {
        this.source.next(values);
    }
}

在离开搜索组件之前,我调用update方法。
现在,我在results组件上。我得到的共享数据如下:

constructor(private dataSvc: DataService,
        private router: Router,
        private rideStore: RideStore) { }

    ngOnInit() {
        this.getData();
    }

    getData() {
        this.subscription = this.dataSvc.data.take(1).subscribe(
            data => this.data = data ? data : undefined,
            err => console.log(err),
            () => this._isValid()
        );
    } 

我的问题是:我需要共享数据来订阅另一个可观察的数据。首先,我构造了一个物体乘坐,在我调用搜索方法之后

    search() {
    this.rideStore.searchRides(this.ride).subscribe(
        rides => {
            // this.dataSvc.update(rides);
            this.rides = rides;
            console.log('results', this.ride);
        },
        err => console.log('err', err)
    );
}

问题是我总是从数据服务获取数据,而不是从api调用。api工作导致我在存储中拦截结果,而不是在组件中。那么,我如何才能停止订阅第一个可观察到的,并订阅第二个?

共有1个答案

施永宁
2023-03-14

在多个组件中共享数据时,行为主题非常有用。你可以想订阅多少次就订阅多少次。您也可以使用unsubscribe方法取消订阅。

让我们使用上述服务并订阅该服务以获取数据:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

@Injectable()
export class DataService {
    public source = new BehaviorSubject<any>(' ');
    data = this.source.asObservable();
    constructor() { }
    update(values: any) {
        this.source.next(values);
    }
}

在这里,我声明了一个初始值为空字符串的行为主题。请记住,您需要为您的行为主题提供一个默认值,无论是空白字符串还是任意数字。之后,我使用asObservable()方法初始化了一个可观察数据。最后,我创建了一个使用next()方法更新行为主题源值的方法。

现在,我将在我们的组件中使用此服务从我们的行为主体获取数据。

subscription: any;

constructor( private dataSvc: DataService ) {
    this.subscription = this.dataSvc.data.subscribe(
        data => console.log('Data:', data),
        err => console.log(err),
        () => console.log('complete')
    );
}

在这里,我将我们的DataService注入到我们的组件中,并创建了该DataService dataSvc的一个实例。我使用dataSvc调用我们的数据可观察,并订阅该数据可观察,以从我们的行为主体获取数据。因此,我将通过以下代码在浏览器控制台中获得的输出是:

Data: 

所以我得到这个空,因为我使用了一个空字符串作为我的行为主体的默认值。

现在要更新行为主体的值,我必须使用dataSvc服务的更新方法,将空字符串的行为主体的值更新为新值。

//Insert this before subscribing the data observable
this.dataSvc.update('abc');

//Output in the console.
Data: abc

现在该值已从空字符串更新为abc。这将反映在订阅此行为主体的每个组件中。

所以,如果我想退订这个订阅。所以我们必须将订阅初始化为

subscription: ISubscription;

然后每当我们想退订的时候,我们就会像这样调用退订方法

this.subscription.unsubscribe();

因此,特定组件的完整代码如下:

import { Component } from '@angular/core';
import { DataService } from "./data.service";
import {ISubscription} from "rxjs/Subscription";


@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  subscription: ISubscription;

  constructor( private dataSvc: DataService ) {
    this.subscription = this.dataSvc.data.subscribe(
      data => console.log('Data:', data),
      err => console.log(err),
      () => console.log('complete')
    );
    this.dataSvc.update('abc');
    this.subscription.unsubscribe();
  }
}
 类似资料:
  • 本文向大家介绍system.reactive 订阅/取消订阅可观察对象(IDisposable),包括了system.reactive 订阅/取消订阅可观察对象(IDisposable)的使用技巧和注意事项,需要的朋友参考一下 示例 订阅返回IDisposable: 当您准备取消订阅时,只需处置订阅即可:            

  • 在ngOnDestory中,我取消了两个订阅,但仍然得到前面的错误。 现在我几乎可以肯定问题出在这行:即使我在注销之前取消了proposalSubscription和chatSubscription的订阅,但仍然会出现错误。有没有解决这个问题的方法?而且,我对RXJ和操作符没有太多的经验。有没有操作符可以用来避免这种嵌套订阅? 提前道谢。

  • 我试图理解可观察对象是如何执行的,但似乎无法让这个简单的代码正常工作。 不应该是你好。订阅()执行?

  • 我最近才知道,我们必须在Angular破坏组件之前取消订阅,否则会造成内存泄漏。 我还知道,我们可以获得对订阅的引用,通过对该订阅调用unsubscribe方法,我们可以进行订阅。例如: 下面的方法会起作用吗?在HTTP调用的情况下,退订是最好的方法吗?

  • 我有这个问题,我一直在寻找,但找不到解决方案(或者也许我不能根据其他答案做出解决方案)。 我的问题是,我需要找到一种方法来等待可观察的(有自己的订户)并等待另一个可观察的(有自己的订户)完成。 场景是这样的: 奥布1- 奥布斯2 - 我主要担心的是我需要两个订阅者。在我看来,obs1 和 obs2 并行运行,但需要检查 obs1 是否以新的会话令牌完成。也许这不是RxJava的主要目的。 Obs1

  • mysql会员订阅数据表的设计应该如何设计?产品有订阅商品和非订阅的,每次都只能购买一个。 订阅有1个月 3个月的 每次到期自动扣费。如果在一个月类购买了几个订阅商品 则扣费按照最新的一个 然后延长到期时间。其实是不是每次订阅都不需要生成新订单的 翻阅了其他资料都找不到很好的设计