【问题标题】:RxJS Subject never pushed the first nextRxJS Subject 从来没有推送过第一个 next
【发布时间】:2019-12-19 18:49:39
【问题描述】:

我在构建主题和评论系统方面遇到问题。它工作正常,但是在有人发表另一条评论之前,发布的第一条评论永远不会出现,此后所有其他 cmets 都可以正常工作。我曾尝试使用 BehaviourSubject 给出初始值为 null 或 "" 和 ReplaySubject 但我认为我可能会遗漏这些工作方式的某些内容,无论如何要让这项工作实时进行,即当用户推送评论时它会转到服务器并且无需立即提交第二条评论即可重新添加到堆栈中?

import { Injectable } from '@angular/core';
import { Observable } from "rxjs/Observable"
import { BehaviorSubject } from "rxjs/BehaviorSubject"
// import {Subject} from "rxjs/Subject"
import { ServerAPI } from '../serverapi';
import { ReplaySubject } from 'rxjs/internal/ReplaySubject';
import { Subject } from 'rxjs/Subject';

@Injectable({
    providedIn: 'root'
})
export class Comments {
    private _comments = new Subject<any[]>();
    $comments: Observable<any> = this._comments.asObservable();

    constructor(private api: ServerAPI) {
        this.$comments.subscribe(() => {
            console.log('comments sub\'d');
        });
    }

    async comment(threadID: string, commentData: any): Promise<any> {
        await this.api.postComment(threadID, commentData);
        const fetchComments = await this.api.getComments(threadID);
        this._comments.next(fetchComments);
    }
}

在我的模板中,我通过订阅 li 收到了 cmets

this.comment.$comments.subscribe(chats => {
    this.CommentData = chats;
});

【问题讨论】:

  • 您是否确保您的“模板”订阅在第一次发布后完成?如果之前完成,您将永远无法使用 Subject 获得该值。尽管如此,您说使用 BehaviourSubject 不起作用?它应该......你能再测试一下吗?当你订阅一个行为主题时,它总是返回最后一个值,它应该在订阅时发出一些东西。
  • 你能添加一个stackblitz吗?

标签: javascript node.js angular typescript rxjs


【解决方案1】:

你需要有一个功能来订阅这样的主题

getData() {
    return this._comments.asObservable();
}

这就是您在组件中订阅 getData() 的方式

this.service.getData().subscribe(x=> {
   console.log(x);
});

像你现在所做的那样订阅构造函数只会执行一个

constructor(private api: ServerAPI) {
    this.$comments.subscribe(() => {
        console.log('comments sub\'d');
    });
}

【讨论】:

  • 为什么不能像我在 observable 变量上那样简单地订阅? $comments: Observable&lt;any&gt; = this._comments.asObservable();
  • 我不确定,但这就是您从主题获取数据的方式。
  • 我不认为你的提议和我已经在做的有任何区别或优势 - 除了你把它放在一个函数中之外,它看起来基本相同
猜你喜欢
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2019-07-08
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多