Answers:
无法100%确定所需的内容,但是如果您只想观察第一个值,请使用first()
或take(1)
:
observable.first().subscribe(func);
注意:满足条件时.take(1)
,.first()
两者都会自动退订
摘自Coderer的评论。
import { first } from 'rxjs/operators'
observable
.pipe(first())
.subscribe(func);
observable.pipe(first()).subscribe(func)
是哪里first
来的rxjs/operators
。
为了补充@Brandon的答案,使用first()
或类似方法对于基于的更新a也是必不可少BehaviorSubject
的Observable
。例如(未测试):
var subject = new BehaviorSubject({1:'apple',2:'banana'});
var observable = subject.asObservable();
observable
.pipe(
first(), // <-- Ensures no stack overflow
flatMap(function(obj) {
obj[3] = 'pear';
return of(obj);
})
)
.subscribe(function(obj) {
subject.next(obj);
});
扩展了M FuatNUROĞLU关于将可观察者转换为承诺的惊人答案,这是它的非常方便的版本。
const value = await observable.toPromise();
console.log(value)
这样做的好处是我们可以像普通变量一样使用该值,而无需引入另一个嵌套块!
当您需要从多个可观察对象获取多个值时,这特别方便。干净整洁。
const content = await contentObservable.toPromise();
const isAuthenticated = await isAuthenticatedObservable.toPromise();
if(isAuthenticated){
service.foo(content)
}
当然,async
如果要遵循此路线,则必须使您的包含功能。.then
如果您不希望包含函数异步,也可以只是承诺
我不确定这种方法是否存在折衷,请随时在评论中让我知道,以便我们知道。
PS:如果您喜欢这个答案,别忘了同时赞扬M FuatNUROĞLU的答案:)
我有类似的问题。
下面甚至从不同的状态转换器调用。如我所愿。
function foo() {
// this was called many times which was not needed
observable.subscribe(func);
changeObservableState("new value");
}
我决定尝试unsubscribe()
订阅后如下。
function foo() {
// this was called ONE TIME
observable.subscribe(func).unsubscribe();
changeObservableState("new value");
}
subscribe(func).unsubscribe();
就像subscribeOnce(func)
。
希望对您有帮助。