Rxjs 创建一次性订阅
我需要创建一个订阅,订阅一个Rxjs 创建一次性订阅,rxjs,Rxjs,我需要创建一个订阅,订阅一个可观察的,当它第一次被调用时会立即被处理掉 是否有类似于: observable.subscribeOnce(func); 在我的用例中,我正在快速路由处理程序中创建一个订阅,并且每个请求都会多次调用该订阅。不能100%确定您需要什么,但如果您只想观察第一个值,请使用first()或take(1): 注意:.take(1)和.first()这两个选项都在满足条件时自动取消订阅 从RxJS 5.5更新+ 从作者的评论中 从'rxjs/operators'导入{firs
可观察的
,当它第一次被调用时会立即被处理掉
是否有类似于:
observable.subscribeOnce(func);
在我的用例中,我正在快速路由处理程序中创建一个订阅,并且每个请求都会多次调用该订阅。不能100%确定您需要什么,但如果您只想观察第一个值,请使用
first()
或take(1)
:
注意:.take(1)
和.first()
这两个选项都在满足条件时自动取消订阅
从RxJS 5.5更新+
从作者的评论中
从'rxjs/operators'导入{first}
可观察
.pipe(第一个())
.认购(func);
RxJS有一些我见过的最好的文档。下面的链接将带您进入一个非常有用的表,该表将用例映射到操作符。例如,在“我想取第一个值”用例下有三个操作符:
first
、firstOrDefault
和sample
注意,如果一个可观察序列在没有通知的情况下完成,则first
操作符向订阅者通知一个错误,而firstOrDefault
操作符向订阅者提供一个默认值
作为补充,使用first()
或类似工具对于根据可观察对象更新行为主体
也是必不可少的。例如(未经测试):
var subject=newbehaviorsubject({1:'apple',2:'banana'});
var observable=subject.asObservable();
可观察
.烟斗(
首先(),//如果您只想调用一次Observable,这意味着您不需要等待来自它的流。因此,在您的情况下,使用toPromise()
而不是subscribe()
就足够了,因为toPromise()
不需要取消订阅。干净方便的版本
在M Fuat NUROĞLU关于将可观测转化为承诺的惊人答案的基础上,这里是非常方便的版本
const value=wait observable.toPromise();
console.log(值)
其美妙之处在于,我们可以像普通变量一样使用该值,而无需引入另一个嵌套块
当您需要从多个观测值中获取多个值时,这尤其方便。整洁干净
const content=wait contentObservable.toPromise();
const isAuthenticated=等待isAuthenticatedObservable.toPromise();
如果(未经验证){
service.foo(内容)
}
当然,如果要使用此方法,则必须使包含函数异步
。也可以只。如果不希望包含函数异步,则
承诺
我不确定这种方法是否有折衷之处,请随时在评论中告诉我,以便我们了解
另外,如果你喜欢这个答案,别忘了也投票给我Fuat NUROĞLU的答案:)我也有类似的问题
下面是后来从不同的状态转换程序调用的。因为我不想
函数foo(){
//这被多次调用,但并不需要
可观察。订阅(func);
不动产(“新价值”);
}
我决定在订阅后尝试unsubscribe()
,如下所示
函数foo(){
//这叫一次
observeable.subscribe(func.unsubscribe();
不动产(“新价值”);
}
subscribe(func.unsubscribe()
类似于subscribeeonce(func)
我希望这对您也有帮助。订阅是否会在之后自动清理?是的。首先,当他们的条件满足时,双方都取消订阅。为什么文档没有说它会自动处理订阅?RxJS的一般规则是,当可观察到的流结束时,订阅会被处理。这意味着任何“缩短”流(或将其转换为不同类型的流)的操作员在其操作完成时都将从源流取消订阅。我不确定文档中是否有说明。如果2018年有人来这里,你实际上想要observable.pipe(first()).subscribe(func)
,其中first
来自rxjs/operators
。非常有趣,这也意味着我们可以等待承诺的实现liner@LouieAlmeda你能给我们举个一行程序的例子吗?嗨@AdoRen,我在这里的回答中为你阐述了这项技术,我希望这会有所帮助。toPromise()
更像是observable.pipe(last())
而不是first()
。是的“承诺”的答案是:wait observable.pipe(take(1)).toPromise()
请注意,在基本的可观察对象完成之前,承诺不会解决。因此,如果.toPromise()
不起作用,请检查您的可观察对象是否已完成。例如,“take(1)”“可能有帮助:const value=await observable.pipe(take(1)).toPromise()
请参阅以下注释:
observable.first().subscribe(func);
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);
});