我不知道如何从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)
我在这做错了什么?
标题说明了一切.如何在不订阅的情况下从Observable获取当前值?我只想要当前值一次而不是新值,因为它们正在进入......
我想知道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) 因为众所周知应该避免在 BehaviorSubject 上使用 getValue() 方法链接 我想知道读取和更新 BehaviorSubject 的最佳方法是什么。
在我的例子中,我有一个 BehaviorSubject 存储一个对象数组,当我单击一个按钮时,我应该将另一个对象推送到该数组并将新值发送给所有订阅者。
现在我正在做:
this.myBehaviorSubject.next([
...this.myBehaviorSubject.value,
{ new object }
])
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法?
谢谢!!
我需要在不触发对任何订阅的下一次调用的情况下设置我的 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 中,然后导航到视图页面。但是,这个初始值的设置会触发列表的刷新,这是我不想做的。我只想初始化该值,然后监听以防编辑页面更改它,然后刷新我的列表。
在我的项目中,我使用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) 我正在使用 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 吗?
我想为基元添加一些方法。我有以下文件:
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不太了解,因此,如果您需要更多信息,请提供。
谢谢。
我有一个获取 BehaviourSubjects 的角度 (9) 组件。我从许多这样的来源学习到在显示可观察内容时使用async-pipe (而不是在 ngInit 中订阅它)。还有一个技巧,使用*ngIf*withas可以避免一直重复。但既然它们毕竟是行为主体,我可以简单地做
<div>{{behaviourSubject.getValue()}}</div>
Run Code Online (Sandbox Code Playgroud)
管他呢。实际上,对我来说,使用“异步”似乎更干净,并且实际上会导致更少的问题。但我不确定这是一个好的模式还是有严重的缺点?
假设我们实现了Angular服务,并且需要向Observable<number[]>世界发布:
numbers: Observable<number[]>;
Run Code Online (Sandbox Code Playgroud)
我们希望订户:
从#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) 我有一个名为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函数将单个书籍添加到列表中,但是我不知道如何添加可观察到的单个书籍(主题观察者)是否可以添加一本书
由于多种原因,这不是重复的。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中获取布尔值,真/假值?
angular ×12
rxjs ×9
typescript ×3
javascript ×2
observable ×2
angular6 ×1
angular7 ×1
rxjs5 ×1