相关疑难解决方法(0)

如何从里面有Observable订阅的函数返回值?

我不知道如何从Observable中提取值以由Observable存在的函数返回.我只需要从中返回一个值,没有别的.

当前版本有效

function getValueFromObservable() {
    this.store.subscribe(
        (data:any) => {
            console.log(data)
        }
    )
}
getValueFromObservable()
Run Code Online (Sandbox Code Playgroud)

我需要这个工作,函数返回值,然后:

function getValueFromObservable() {
    this.store.subscribe(
        (data:any) => {
            return data
        }
    )
}
console.log(getValueFromObservable())
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

rxjs typescript rxjs5 angular

71
推荐指数
4
解决办法
12万
查看次数

从Observable获取当前值而无需订阅(只需要一次值)

标题说明了一切.如何在不订阅的情况下从Observable获取当前值?我只想要当前值一次而不是新值,因为它们正在进入......

observable rxjs angular

34
推荐指数
3
解决办法
3万
查看次数

RXJS - BehaviorSubject:正确使用 .value

我想知道behaviorSubject.value. 根据这个答案,我们应该只通过订阅获得价值。

一个对我来说似乎没问题的情况是我使用.value来确定下一个值来推送流,就像我切换一个简单的布尔值一样:

myBoolSubject = new BehaviorSubject(false);

toggle() {
  this.myBoolSubject.next(!this.myBoolSubject.value);
}
Run Code Online (Sandbox Code Playgroud)

使用的替代方法subscribe()如下:

toggle() {
   this.myBoolSubject.pipe(take(1)).subscribe(
      val => this.myBoolSubject.next(!val)
   );
}
Run Code Online (Sandbox Code Playgroud)

通过查看rxjs 源代码和上述答案,这两种方法之间的区别在于.value

  • 题目已经完成
  • 出现错误

在这个简单的例子中,我不会完成这个主题,我不认为错误是一个问题,因为我只是通过这个主题推送简单的布尔值。

这是一个有效的用例behaviorSubject.value吗?还有其他人吗?

另一种似乎可以使用的情况.value是从先前发出的值构造一个新对象时:

private state = new BehaviorSubject<State>(INITIAL_STATE);
public state$ = this.state.asObservable();

public updateState(changes: Partial<State>){
    const newState = {...this.state.value, ...changes};
    this.state.next(newState);
}

Run Code Online (Sandbox Code Playgroud)

另一种方法是将最新的状态发射缓存在另一个变量中,如下所示:

private _state = INITIAL_STATE;
private state = new BehaviorSubject<State>(INITIAL_STATE);
public state$ = this.state.asObservable();

public updateState(changes: Partial<State>){
    const …
Run Code Online (Sandbox Code Playgroud)

rxjs angular

10
推荐指数
2
解决办法
1115
查看次数

读取和更新 BehaviorSubject 值的最佳方法

因为众所周知应该避免在 BehaviorSubject 上使用 getValue() 方法链接 我想知道读取和更新 BehaviorSubject 的最佳方法是什么。

在我的例子中,我有一个 BehaviorSubject 存储一个对象数组,当我单击一个按钮时,我应该将另一个对象推送到该数组并将新值发送给所有订阅者。

现在我正在做:

this.myBehaviorSubject.next([
    ...this.myBehaviorSubject.value,
    { new object }
])
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法?

谢谢!!

rxjs behaviorsubject angular

7
推荐指数
1
解决办法
8394
查看次数

如何在不调用 next 的情况下设置新的 BehaviorSubject 值?

我需要在不触发对任何订阅的下一次调用的情况下设置我的 BehaviorSubject 的值。

我尝试这样做:

this.mySubject = new BehaviorSubject(newVal);
Run Code Online (Sandbox Code Playgroud)

但这也会删除所有订阅。

this.mySubject.value = newVal;
Run Code Online (Sandbox Code Playgroud)

不起作用,因为.value是只读的。

有什么办法可以做到这一点吗?

编辑:对于那些问我为什么需要这样做的人...

这是一个 Ionic 4 应用程序,因此有一个根列表页面调用另外 2 个子页面(一个详细信息视图和一个编辑页面)。进入视图页面的第一个导航需要选择的模型。列表页面将此模型的初始值设置到 BehaviorSubject 中,然后导航到视图页面。但是,这个初始值的设置会触发列表的刷新,这是我不想做的。我只想初始化该值,然后监听以防编辑页面更改它,然后刷新我的列表。

rxjs behaviorsubject angular

6
推荐指数
2
解决办法
3317
查看次数

take(1) vs firstValueFrom vs observable.value

在我的项目中,我使用BehaviorSubjects 作为数据存储来存储应用程序的状态。

我只需要存储中当前保存的当前BehaviorSubject值,不需要订阅可以通过行为主体发出的未来值。

我发现很少有实现此操作的方法:使用pipe(take(1)),firstValueFrom.value

所有的工作方式都相同并读取BehaviorSubject 存储中的当前值吗?如果有的话,它们之间有什么区别?

private myStore$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);

// reading only one current value using take(1):
this.myStore$.pipe(take(1))
    .subscribe(value => console.log('current value = ', value));

// reading only one current value using firstValueFrom:
const value = await firstValueFrom(this.myStore$);
console.log('current value = ', value);

// reading only one current value using this.myStore$.value:
const value = this.myStore$.value;
console.log('current value = ', value);
Run Code Online (Sandbox Code Playgroud)

rxjs angular2-observables angular

5
推荐指数
1
解决办法
2万
查看次数

在 Angular 服务中频繁使用 BehaviorSubject 是一个危险信号吗?

我正在使用 Angular 编写一个应用程序,并发现自己经常使用这种模式:

@Injectable(...)
export class WidgetRegsitryService {
  private readonly _widgets: BehaviorSubject<Widget[]> = new BehaviorSubject([]);
  public get widgets() { return this._widgets.value; }
  public readonly widgets$ = this._widgets.asObservable();

  public add(widget: Widget) {
    const old = this._widgets.value.slice();
    old.push(widget);
    this._widgets.next(old);
  }
}
Run Code Online (Sandbox Code Playgroud)

许多服务将有 3-5 个或更多这样的公共 getter 和私人支持主题组。它发生得太多了,以至于代码感觉非常冗长和重复。所以:a) 有没有一种干的方式来做到这一点,b) 我在这里滥用 Observables 吗?

observable rxjs typescript angular

4
推荐指数
1
解决办法
578
查看次数

Angular 7向基元添加扩展方法

我想为基元添加一些方法。我有以下文件:

string-extension.ts:

interface String {
    isNullOrEmpty(this: string): boolean;
}

String.prototype.isNullOrEmpty = function (this: string): boolean {
    return !this;
};
Run Code Online (Sandbox Code Playgroud)

我有一个包含以下代码的组件:

constructor () {
    let a = "asd";
    alert(a.isNullOrEmpty());
}
Run Code Online (Sandbox Code Playgroud)

没有导入被添加到顶部。当我运行客户端时,它在该行崩溃。

a.isNullOrEmpty is not a function
Run Code Online (Sandbox Code Playgroud)

当我检查代码时,我发现我的string-extension.ts文件未包含在其中。我对C#中的概念非常熟悉,但对TypeScript不太了解,因此,如果您需要更多信息,请提供。

谢谢。

extension-methods typescript-typings angular angular7

2
推荐指数
1
解决办法
706
查看次数

渲染 BehaviourSubject:可以在模板中使用 getValue() 吗?

我有一个获取 BehaviourSubjects 的角度 (9) 组件。我从许多这样的来源学习到在显示可观察内容时使用async-pipe (而不是在 ngInit 中订阅它)。还有一个技巧,使用*ngIf*withas可以避免一直重复。但既然它们毕竟是行为主体,我可以简单地做

<div>{{behaviourSubject.getValue()}}</div>
Run Code Online (Sandbox Code Playgroud)

管他呢。实际上,对我来说,使用“异步”似乎更干净,并且实际上会导致更少的问题。但我不确定这是一个好的模式还是有严重的缺点?

javascript rxjs angular

2
推荐指数
1
解决办法
2189
查看次数

将修改后的数组发布到Observable

任务

假设我们实现了Angular服务,并且需要向Observable<number[]>世界发布:

numbers: Observable<number[]>;
Run Code Online (Sandbox Code Playgroud)

我们希望订户:

  1. 订阅时获得最后的价值
  2. 每次我们更改并发布时,都会收到整个修改后的数组

从#1开始,内部Observable<number[]>应至少为a BehaviorSubject<number[]>

但是2号呢?假设我们需要实现一个方法publishNumbersChange(),该方法在我们需要更改和发布更改后的数组时被调用:

private publishNumbersChange() {
    // Get current numbers array
    ...        

    changeArray();

    // Now publish changed numbers array
    ...
}
Run Code Online (Sandbox Code Playgroud)

问题

RxJS 5模式是什么,用于实现根据其先前项目发布修改后的数组的任务?

因为我问这个问题主要是因为当前我正在做Angular的东西,所以这里是问题的第二部分:
Angular(以及基于RxJS的类似框架)在提供Observable哪种类型参数是数组时会使用什么代码?随后发布更新的数组?
他们只是单独保留当前发布的数组的副本吗?

一些想法

看来,分别存储基础数组是最简单的事情,因此我们始终可以访问它。但是同时,它看起来不像RxJS方式(需要在RxJS流外部具有状态)。

另一方面,我们可以执行以下操作:

private publishNumbersChange() {
    // To get the latest value from the stream, we have to subscribe
    const subscription: Subscription = this.numbers.subscribe((numbers: number[]) => {
        // We got the last value in stream in numbers …
Run Code Online (Sandbox Code Playgroud)

javascript reactive-programming rxjs typescript angular

1
推荐指数
1
解决办法
1022
查看次数

如何将对象添加到可观察数组

我有一个名为BookService的服务项目。

private books: Subject<Book[]>;

getBookList(skip:number = 0,limit:number = 0): Subject<Book[]> {
  return this.books;
}

addBookToList(book:Book) {
}
Run Code Online (Sandbox Code Playgroud)

此服务可帮助我监视书籍列表中的更改,我还希望能够使用addBookToList函数将单个书籍添加到列表中,但是我不知道如何添加可观察到的单个书籍(主题观察者)是否可以添加一本书

subject-observer angular angular6

0
推荐指数
1
解决办法
1902
查看次数

将Observable &lt;boolean&gt;转换为布尔值

由于多种原因,不是重复的。1.我使用的是角度7,而不是角度2。2.我使用的是rxjs6,而不是rxjs5。学习这些较早的版本已不存在,我对此无益。3.当这个问题没有提到Observable(boolean)时,我问的是Observable(boolean)概念

我创建了一个Observable值,希望从中得出true / false。这是我在nav.component.ts文件中的代码

export class NavComponent implements OnInit {
  private $loggedin: Observable<boolean>;

  constructor( private auth: AuthenticationService){}
  ngOnInit() {
    this.$loggedin = this.auth.$isLoggedinSource;
    console.log('am i logged in ', this.$loggedin);
  }
Run Code Online (Sandbox Code Playgroud)

控制台输出为:

am i logged in Observable {_isScalar: false, source: BehaviorSubject}
               source: BehaviorSubject {_isScalar: false, observers: 
               Array(0), closed: false, isStopped: false, hasError: 
               false, …}
               _isScalar: false ...
Run Code Online (Sandbox Code Playgroud)

如何从$ loggedin中获取布尔值,真/假值?

behaviorsubject angular

0
推荐指数
1
解决办法
2764
查看次数