Rx java 使用RxJava的同步序列

Rx java 使用RxJava的同步序列,rx-java,rx-java2,Rx Java,Rx Java2,我正在努力研究如何用RxJava表达以下内容。假设我有一个要在网络上传输的数据包流列表: PublishSubject<List<Packet>> packetsSubject = ...; PublishSubject packetsObject=。。。; 我有以下传输功能: public Observable<Status> transmit(Packet p) {...} 公共可观测传输(包p){…} 只要返回的数据包状态为status,我就要发

我正在努力研究如何用RxJava表达以下内容。假设我有一个要在网络上传输的数据包流列表:

PublishSubject<List<Packet>> packetsSubject = ...;
PublishSubject packetsObject=。。。;
我有以下传输功能:

public Observable<Status> transmit(Packet p) {...}
公共可观测传输(包p){…}
只要返回的数据包状态为
status,我就要发送列表中的每个数据包。OK
。换句话说,如果第n分组的传输是NOK,则不应发送第n+1分组

此外,如果检测到错误:

  • 错误应与列表中数据包的索引一起显示
  • 应开始传输下一个数据包列表

感谢您阅读我的文章

您可以使用
flatMap()
操作符将列表转换为可观察的条目。使用
zipWith()
运算符将每个列表条目与单个列表中数据包的索引配对<再次使用code>flatMap()传输并获取结果状态。将一个
NOK
变为可丢弃,并终止内部观察者链。使用
flatMap()
操作符时,添加
1
的最后一个参数会使映射一次发生一次,因此此观察者链中没有请求重叠

packetsSubject
      .flatMap( listOfPackets -> Observable.from( listOfPackets )
            .zipWith( Observable.range( 1, LARGE_NUMBER ), ( p, i ) -> new Pair<>( p, i ) )
            .flatMap( pair -> transmits( pair.getFirst() )
                    .flatMap( status -> status.equals( "OK" )
                            ? Observable.empty()
                            : Observable.error( new IllegalStateException() ) )
                    .doOnError( error -> System.out.println( "Error at index " + pair.getSecond() ) )
                    .onErrorResumeNext( Observable.empty() ), 1 ) )
    .subscribe();
packetssobject
.flatMap(包列表->可观察的.from(包列表)
.zipWith(可观测范围(1,大_数),(p,i)->新对(p,i))
.flatMap(对->传输(对.getFirst())
.flatMap(状态->状态.equals(“确定”)
?可观察。空()
:Observable.error(新的IllegalStateException()))
.doon错误(错误->系统.out.println(“索引处的错误”+pair.getSecond()))
.onErrorResumeNext(Observable.empty()),1))
.subscribe();

虽然我对将
NOK
映射到错误、记录它、然后重新映射结果的最后内部步骤感到不舒服,但这是有原因的。
listOfPackets
的处理必须在处理完所有数据包或看到
状态时终止。NOK
;将
Status.NOK
转换为错误指示器即可完成此操作。但是,我们只希望终止单个列表的处理,而不希望终止整个可观察项。

您可以使用
flatMap()
操作符将列表转换为可观察项。使用
zipWith()
运算符将每个列表条目与单个列表中数据包的索引配对<再次使用code>flatMap()传输并获取结果状态。将一个
NOK
变为可丢弃,并终止内部观察者链。使用
flatMap()
操作符时,添加
1
的最后一个参数会使映射一次发生一次,因此此观察者链中没有请求重叠

packetsSubject
      .flatMap( listOfPackets -> Observable.from( listOfPackets )
            .zipWith( Observable.range( 1, LARGE_NUMBER ), ( p, i ) -> new Pair<>( p, i ) )
            .flatMap( pair -> transmits( pair.getFirst() )
                    .flatMap( status -> status.equals( "OK" )
                            ? Observable.empty()
                            : Observable.error( new IllegalStateException() ) )
                    .doOnError( error -> System.out.println( "Error at index " + pair.getSecond() ) )
                    .onErrorResumeNext( Observable.empty() ), 1 ) )
    .subscribe();
packetssobject
.flatMap(包列表->可观察的.from(包列表)
.zipWith(可观测范围(1,大_数),(p,i)->新对(p,i))
.flatMap(对->传输(对.getFirst())
.flatMap(状态->状态.equals(“确定”)
?可观察。空()
:Observable.error(新的IllegalStateException()))
.doon错误(错误->系统.out.println(“索引处的错误”+pair.getSecond()))
.onErrorResumeNext(Observable.empty()),1))
.subscribe();

虽然我对将
NOK
映射到错误、记录它、然后重新映射结果的最后内部步骤感到不舒服,但这是有原因的。
listOfPackets
的处理必须在处理完所有数据包或看到
状态时终止。NOK
;将
Status.NOK
转换为错误指示器即可完成此操作。但是,我们只希望终止单个列表的处理,而不希望终止整个可观察列表。

您是否尝试使用
concat
操作符?对于错误处理,新列表和旧列表有什么关系吗?这两个列表没有任何共同点,我通过切片请求负载得到一个数据包列表。concat操作符如何适应这张图片?我认为使用
concat
时,请求的发生顺序与列表中的顺序相同。如果其中一项失败,则不尝试下一项。是否尝试使用
concat
运算符?对于错误处理,新列表和旧列表有什么关系吗?这两个列表没有任何共同点,我通过切片请求负载得到一个数据包列表。concat操作符如何适应这张图片?我认为使用
concat
时,请求的发生顺序与列表中的顺序相同。如果一个失败了,那么你就不尝试下一个项目。