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);
  });