Angular 5 订阅和取消订阅 Observable

2024-04-19

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

我有一个数据共享服务:

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 方法。
现在,我正在讨论结果部分。我得到这样的共享数据:

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 有效是因为我拦截了存储中的结果,但不在组件中。那么我如何停止订阅第一个可观察对象并订阅第二个可观察对象?


行为主体、订阅和取消订阅 Observables

行为主体在多个组件中共享数据时非常有用。您可以根据需要多次订阅。您也可以使用取消订阅方法取消订阅。

让我们使用上面的服务并订阅该服务来获取数据:

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() method.

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

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 的一个实例dataSvc。我使用 dataSvc 来调用我们的数据可观察对象并订阅该数据可观察对象以从我们的行为主体获取数据。因此,我将通过以下代码在浏览器控制台中获得的输出是:

Data: 

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

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

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

//Output in the console.
Data: abc

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

那么如果我想取消订阅这个订阅怎么办?所以我们必须将订阅初始化为

subscription: ISubscription;

然后每当我们想要取消订阅时,我们都会像这样调用 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();
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 5 订阅和取消订阅 Observable 的相关文章

随机推荐

  • 为什么这个游戏无法开始,它正在循环[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经检查了这段代码的每一寸 我无法找出是什么导致它进入循环 一旦我按下按键开始 它就会播放开始噪音 然后它会转到结束屏幕 并说按按键再次
  • 调用 GC.Collect 和 GC.WaitForPendingFinalizers 时会发生死锁吗?

    鉴于以下情况 GC Collect GC MaxGeneration GC WaitForPendingFinalizers GC Collect GC MaxGeneration 考虑到多线程和垃圾收集模式 什么情况下会出现死锁WaitF
  • (1U << X) 有什么作用?

    我找到了这段代码 enum IsDynamic 1U lt lt 0 IsSharable 1U lt lt 1 IsStrong 1U lt lt 2 什么是 1U lt lt X do 它设置位掩码 1U lt lt 0 1 1U lt
  • 如何在mongoengine中通过oid搜索文档

    我需要通过 oid 从 db 获取文档 例如 Docs objects id 4f4381f4e779897a2c000009 但如何做到这一点 如果 id 需要 ObjectId 对象 即使我尝试从 pymongo 设置 ObjectId
  • 时间计算类型不匹配

    我正在尝试计算seconds两个日期之间的差异保留两位小数 但是 每当我执行代码时 都会收到错误 13 类型不匹配 我在网上搜索并尝试了许多变体 但总是以类型不匹配而告终 我不知道如何解决这个问题 有人可以教我怎么做吗 INFO 最初使用的
  • 使用“make-series”运算符而不定义确切的日期范围

    我在用make series创建一个错误仪表板 以指定的时间间隔显示给定时间段内的事件 如下所示 make series dcount id default 0 on timestamp from ago 30d to now step 8
  • 使用 pyinstaller 在所有系统上保留字体

    我使用 tkinter 制作了一个 GUI 我用 pyinstaller 创建了 onefile exe 但设置的字体 font freesans ttf 不适用于其他计算机 我想我需要添加字体 但在与我类似的情况下 我不明白 pygame
  • 球体表面上测地线(最短距离路径)之间的交点

    我进行了广泛的搜索 但尚未找到该问题的合适答案 给定球体上的两条线 每条线由起点和终点定义 确定它们是否相交以及相交的位置 我找到了这个网站 http mathforum org library drmath view 62205 html
  • PowerShell 未启动

    由于某种原因 PowerShell 不再在我的计算机上打开 打开 PowerShell 会显示以下内容 但永远不会完成打开并且永远不会显示提示 Windows PowerShell Copyright C Microsoft Corpora
  • Android 模拟器上的 Mockito

    Android 新手尝试在 Android 中使用我最喜欢的 Java 测试工具 我正在尝试使用 Mockito 1 9 5 如以下博客文章中所述 但无法在我的模拟器上运行测试 我目前没有用于测试的物理设备 Mockit Android 教
  • Android 版百度地图:访问键无法用于位置搜索

    我正在为中国客户创建一个 Android 应用程序 他们需要地图集成 因此 Google 地图不是一个选择 因为所有 Google 服务在中国都被屏蔽 我正在尝试使用百度地图 它被称为百度LBS 基于位置的服务 云 获得没有叠加层的基本地图
  • GetMessage() 在主消息循环中会返回 -1 吗?

    根据获取消息API http msdn microsoft com en us library ms644936 28VS 85 29 aspx从 MSDN 库来看 出现错误时可能会返回 1 该文档提供了应避免的常见错误的代码片段 whil
  • Java:如何在 ScrollPane 视口上绘制非滚动覆盖?

    我想使用 ScrollPane 在其视口中显示图像 并且在图像上覆盖网格 或框 或任何其他类型的注册 位置标记 我需要覆盖层在滚动时保持固定 这意味着图像似乎在覆盖层 下方 移动 我将以固定速率滚动视口中的视图以提供平滑的运动 而叠加层将提
  • 在 JSX 中使用大括号声明 Const

    我刚刚开始使用 React Native 并习惯 JSX 语法 这就是我所说的吗 或者我在谈论 TypeScript 或者 ES6 反正 我见过这个 const foo this props 在类函数内部 大括号的用途是什么 使用它们和不使
  • 查找日历的第一天

    我想做的是创建一个简单的日历 我想找到特定月份第一周的第一天 我的日历是星期一 gt 星期日日历 以下代码可以工作 但正如您所看到的 它并不是那么好 任何人都对如何获取日历中的第一个日期有更好的想法 var now new DateTime
  • 如何让 wget 在网页索引文件的工作本地副本中包含日期和时间戳

    我有一份报告需要每天下载 我想每天下载一次该文件 并让该文件以 report date time html 结尾 示例代码 wget k p O C Users user Desktop New report date time html
  • 使用命令行查找数据文件的行数

    有一种常规方法 逐行读取并检查iostat每次读数时都会达到非零或负值 不过 我想打电话system command 例行公事和 使用wc l命令来计算数量 然后想要分配要放置数据的数组的维度 例如 我以两种方式打印行数 Program T
  • 在每个php脚本之前执行php脚本?

    除了将其放入所有 php 脚本之外 我如何在每个 php 脚本之前运行它 if SERVER REMOTE ADDR 123 123 123 123 SERVER REMOTE ADDR SERVER HTTP X REAL IP 我基本上
  • 如果 Exception 过滤器的过滤器抛出异常会发生什么

    我还没有在 C 6 中工作过 但想知道 正如标题所说 如果Exception过滤器的过滤器抛出异常会发生什么 我想真正的答案是 过滤器应该以永远不会抛出异常的方式编写 但我们可以说它确实如此 异常是否会发生在 catch 本身内部 try
  • Angular 5 订阅和取消订阅 Observable

    我必须从两个订阅获取数据 但我总是得到第一个订阅的数据 我有一个数据共享服务 import Injectable from angular core import BehaviorSubject from rxjs BehaviorSubj