我需要创建一个订阅一个 Observable
的过程,当第一次调用它时就立即将其处置。
是否有类似以下代码:
observable.subscribeOnce(func);
我的使用情况是,在 Express 路由处理程序中创建一个订阅,并且每个请求会多次调用该订阅。
我需要创建一个订阅一个 Observable
的过程,当第一次调用它时就立即将其处置。
是否有类似以下代码:
observable.subscribeOnce(func);
我的使用情况是,在 Express 路由处理程序中创建一个订阅,并且每个请求会多次调用该订阅。
first
、firstOrDefault
和sample
。first
操作符会向订阅者发送错误通知,而firstOrDefault
操作符会向订阅者提供默认值。
操作符使用案例查找更新(2021年12月):
由于 RxJS 7 中的 toPromise()
函数已被弃用,因此新函数已宣布用于替代它。这些函数是 firstValueFrom
和 lastValueFrom
。
firstValueFrom
函数解析第一个发出的值并直接取消订阅资源。当 Observable 在不发出任何值的情况下完成时,它将拒绝并显示 EmptyError。
另一方面,lastValueFrom
函数在某种程度上与 toPromise()
相同,因为它在 observable 完成时解析最后一个发出的值。但是,如果 observable 没有发出任何值,它将拒绝并显示 EmptyError。与 toPromise()
解析 undefined
不同,当没有值发出时。
要了解更多信息,请查看docs。
新答案:
如果你只想调用一次Observable,这意味着你不会等待它的流。因此,在你的情况下,使用toPromise()
而不是subscribe()
就足够了,因为toPromise()
不需要取消订阅。
await
来等待 promise
,从而使其变成一行代码。 - Louie AlmedatoPromise()
更像是 observable.pipe(last())
而不是 first()
。 - Mrk Sefawait observable.pipe(take(1)).toPromise()
。 - Brandon补充一下@Brandon的回答,使用first()
或类似方法对基于Observable
的BehaviorSubject
进行更新也是必要的。例如(未经测试):
Original Answer翻译成“最初的回答”。
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 Fuat NUROĞLU关于将可观察对象转换为Promise的惊人回答的基础上,这是一个非常方便的版本。
const value = await observable.toPromise();
console.log(value)
const content = await contentObservable.toPromise();
const isAuthenticated = await isAuthenticatedObservable.toPromise();
if(isAuthenticated){
service.foo(content)
}
async
。如果不想使包含函数成为async,也可以直接使用.then
来处理promise。.toPromise()
不起作用,请检查您的Observable是否已经完成。例如,可以使用"take(1)"来解决问题:const value = await observable.pipe(take(1)).toPromise()
请参阅此评论:https://github.com/ReactiveX/rxjs/issues/2536#issuecomment-306041463 - zauni我有类似的问题。
以下内容是来自不同状态更改器的后续调用。因为我不想要。
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)
。
希望这也对您有所帮助。
observable.pipe(take(1)).subscribe() 使用 take 1,它将订阅一次,然后退出
rxjs/operators
中的first
函数,使用observable.pipe(first()).subscribe(func)
将其订阅。请注意,这里仅提供翻译,不包括任何解释或其他额外内容。 - Coderer