Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rxjs 仅在使用可管道操作器时产生副作用?_Rxjs_Reactive Programming_Rxjs Pipeable Operators - Fatal编程技术网

Rxjs 仅在使用可管道操作器时产生副作用?

Rxjs 仅在使用可管道操作器时产生副作用?,rxjs,reactive-programming,rxjs-pipeable-operators,Rxjs,Reactive Programming,Rxjs Pipeable Operators,我正在重写我的一些代码,以使用管道操作符来代替“补丁”操作符,我有点困惑于何时使用pipe(),以及如果我只想要副作用,如何订阅管道可观察的来“激活”它 例如,我有以下代码: this.messages$ = this.messageService.getMessages(messageType) .do((messages: Message[]) => { console.log('The first message is ' + deviceMessages[0

我正在重写我的一些代码,以使用管道操作符来代替“补丁”操作符,我有点困惑于何时使用
pipe()
,以及如果我只想要副作用,如何订阅管道
可观察的
来“激活”它

例如,我有以下代码:

this.messages$ = this.messageService.getMessages(messageType)
    .do((messages: Message[]) => {
        console.log('The first message is ' + deviceMessages[0].text);
    });
我在这里感到困惑,因为我想我想做
这个.messageService.getMessages(messageType).pipe(…)
,所以我得到了一个
可观察的
返回并分配给
这个.messages$
,但由于我没有
订阅()
'd,所以它不会执行。但是如果我执行
.pipe(…).subscribe()
操作,那么它将返回一个
Subscription
对象,这不是我想要的


我应该在这里做什么?

好吧,就这样做:

this.messages$ = this.messageService.getMessages(messageType).pipe(
  tap((messages: Message[]) => {
    console.log('The first message is ' + deviceMessages[0].text);
  })
);
this.messages$.subscribe();

tap操作符相当于rxjs 5及更高版本中的
.do()

好吧,只需这样做:

this.messages$ = this.messageService.getMessages(messageType).pipe(
  tap((messages: Message[]) => {
    console.log('The first message is ' + deviceMessages[0].text);
  })
);
this.messages$.subscribe();

tap运算符相当于rxjs 5及以上版本中的
.do()

.pipe(tap(…)
相当于
.do(…)
。无论您是否使用管道操作符,都不会改变可观察对象的工作方式,也不会改变您应该订阅的时间。您订阅触发事件的发射(这里,可能是通过发送HTTP请求),就像以前一样。@JBNizet那么您是说我应该保留
do()
并保持原样吗?不,他/她是说将它切换到
.pipe(点击(…)
,而不是
。执行(…)
,其他任何事情都不必更改。不,它不应该,但是
do()
也没有。您当前使用
do()
的代码是否在不订阅的情况下执行某些操作?如果是这样,那就是一个bug。
async
管道就是这样做的,是的。
.pipe(点击(…)
相当于
.do(…)
。无论您是否使用管道操作符,都不会改变可观察对象的工作方式,也不会改变您应该订阅的时间。您订阅触发事件的发射(这里,可能是通过发送HTTP请求),就像以前一样。@JBNizet那么您是说我应该保留
do()
并保持原样吗?不,他/她是说将它切换到
.pipe(点击(…)
,而不是
。执行(…)
,其他任何事情都不必更改。不,它不应该,但是
do()
也没有。您当前使用
do()
的代码是否在不订阅的情况下执行某些操作?如果是这样,那就是一个bug。
async
管道就是这样做的,是的。