向 Observable 发出新的值

iam*_*015 10 javascript rxjs angular

我有以下代码:

this.isUsingGoogleTwoFactor$ = this.user$.pipe(map((user: User) => 
user.isUsingGoogleTwoFactor));
Run Code Online (Sandbox Code Playgroud)

现在我想要的是向 发出新值isUsingGoogleTwoFactor$。我知道我不能这样做,observables但我应该使用subjects. 但我不知道具体如何用管道来做。

谢谢!

Dan*_*iel 5

检查BehaviourSubject。它是一种 Observable,允许您推送新值并跟踪它发出的最后一个值。

我链接的网站中有一个如何使用它的示例。但简而言之,这就是你如何使用它:

const observable = new BehaviorSubject("initial value");
Run Code Online (Sandbox Code Playgroud)

如果此时有订阅者到来并执行:

observable.subscribe({
    next: (value) => console.log("The value is: ", value)
});
Run Code Online (Sandbox Code Playgroud)

那么输出将是:

The value is: initial value
Run Code Online (Sandbox Code Playgroud)

之后,每次调用时,next所有订阅者都会收到通知:

observable.next("a new value");
Run Code Online (Sandbox Code Playgroud)

将在订阅者中打印此内容:

The value is: a new value
Run Code Online (Sandbox Code Playgroud)


Sno*_*Dan 4

如果我理解正确的话,您希望这个可观察对象在 user$ 发生更改时以及您手动触发它时触发。那么你就可以采用这种方法。

import { merge, Subject } from 'rxjs';

...

const manuallyTriggered$ = new Subject();
const triggeredFromUser$ = this.user$.pipe(
    map((user: User) => user.isUsingGoogleTwoFactor)
);

this.isUsingGoogleTwoFactor$ = merge(manuallyTriggered$, triggeredFromUser$);
Run Code Online (Sandbox Code Playgroud)

当你想手动触发它时:

manuallyTriggered$.next(true);
Run Code Online (Sandbox Code Playgroud)