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

使用可观察对象时,变量返回时未定义

东方俊明
2023-03-14

有人能告诉我为什么未定义this.userDataObserver的变量会导致.next()函数失败吗?在这里撞我的头。

我需要将一些数据推送到可以从其他组件访问的服务变量中(尽量避免使用本地存储)。

有人能帮我理解为什么这个变量在类中被明确设置时是未定义的吗?

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { Observer } from 'rxjs/Observer';
import 'rxjs/add/operator/map';


@Injectable()
export class globalService {
//Sets logon token
userData:any;
userDataRetrieval: Observable<any>;
userDataObserver: any;
//Sets + updates user info
userInfo: any;
userInfoRetrieval: Observable<any>;
userInfoObserver: any;

constructor() {
    this.userDataRetrieval = new Observable(observer => {
        this.userDataObserver = observer;
    })
    this.userInfoRetrieval = new Observable(observer => {
        this.userInfoObserver = observer;
    })

}
setUser(userData: any) {
    this.userData = userData;
    this.userDataObserver.next(this.userData); this.userDataObserver comes back undefined when calling this function from my component.
}

saveUserInfo(userInfo: any) {
    this.userInfo = userInfo;
    this.userInfoObserver.next(this.userInfo);
}

}

共有2个答案

井逸明
2023-03-14

回答您的具体问题:如果您查看可观测数据的来源,您将看到以下内容:

  /**
   * @constructor
   * @param {Function} subscribe the function that is  called when the Observable is
   * initially subscribed to. This function is given a Subscriber, to which new values
   * can be `next`ed, or an `error` method can be called to raise an error, or
   * `complete` can be called to notify of a successful completion.
   */
  constructor(subscribe?: (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic) {
    if (subscribe) {
      this._subscribe = subscribe;
    }
  }

这段代码显示了可观察构造函数的参数是一个回调,在订阅可观察构造函数时调用。由于您从未在代码中调用订阅,因此您传递的用于创建可观察性的回调从未被调用。

现在,从你给出的代码示例中,很难理解你想要实现什么。也许你可以提供一些额外的背景/解释,以便获得实现最终目标的指导,不管是什么。

苏丰茂
2023-03-14

相反,直接调用this.userDataObserver.next(this.userData),您应该使用以下方法,并尝试是否适用于您:

setUser(userData: any) {
    this.userData = userData;
    this.userDataObserver = new Observable(observable => {
        observable.next()
    });
}

让我知道如果这对你不起作用。。。

 类似资料:
  • 我对RxJava很陌生,每当我有一个情况,我需要从链上的一个可观察的返回数据传递到调用“订阅” - 我很难理解如何在没有任何补丁的情况下以“反应式”方式做到这一点...... 例如: 我想发出obs1和obs2,得到它们的结果,然后发出obs3然后obs4,然后以订阅结束链,同时可以访问obs1、obs2、obs3和obs4的结果。 调用的顺序很重要,我需要在执行obs3之前完成obs1和obs2

  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • 我正在使用RxJava链接异步操作,我想向下游传递一些变量: 这似乎是一种常见的模式,但我找不到有关它的信息。

  • Observables 是多个值的惰性推送集合。它填补了下面表格中的空白: 单个值 多个值 拉取 Function Iterator 推送 Promise Observable 示例 - 当订阅下面代码中的 Observable 的时候会立即(同步地)推送值1、2、3,然后1秒后会推送值4,再然后是完成流: var observable = Rx.Observable.create(functio

  • 有人能向我解释一下为什么运算符可以接受返回或的函数吗? 官方文件说: FlatMap运算符通过将您指定的函数应用于源可观察对象发出的每个项目来转换可观察对象,其中该函数返回本身发出项目的可观察对象。 为什么它也可以返回数组? 例如,它们都是有效的: 但这不起作用:

  • 问题内容: 我使用侦听器作为回调来观察Android的异步操作,但是我认为用RxJava替换此侦听器可能很棒,我是使用此库的新手,但是我真的很喜欢它,并且我始终将其与Android项目一起使用。 这是我的重构代码: 一个简单的回调: 和“观察者”: 谢谢! 问题答案: 例如,您可以使用 Observable.fromCallable 来创建可观察数据。 然后使用您的数据 使用了rxjava 1.x