改型和rxJava请求的特殊异步性
我正在尝试使用如下改型按块上传图像:改型和rxJava请求的特殊异步性,java,reactive-programming,rx-java,Java,Reactive Programming,Rx Java,我正在尝试使用如下改型按块上传图像: rx.Observable.from(image.getChunks()) .flatMap(chunk -> return api.upload(chunk)) .subscribe(resp -> {}, err -> {} ); rx.Observable.from(image.getChunks()) .first() .map(firstChunk -> return api.upload(firs
rx.Observable.from(image.getChunks())
.flatMap(chunk -> return api.upload(chunk))
.subscribe(resp -> {}, err -> {} );
rx.Observable.from(image.getChunks())
.first()
.map(firstChunk -> return api.upload(firstChunk))
.subscribe(
resp -> {
rx.Observable.from(image.getChunks())
.skip(1)
.skipLast(1)
.flatMap(chunk -> return api.upload(chunk))
.subscribe(
resp -> {},
err -> {},
() -> {
rx.Observable.from(image.getChunks())
.last(1)
.map(lastChunk -> {
api.upload(lastChunk).subscribe(
resp -> {
//upload finished
},
err -> {}
)
}
);
},
err -> {}
);
这里的image.getChunks()
返回一个列表
,api
是一个更新服务,返回rx.observatable
看起来不错,但我们的后端有一个特定的定义,即第一块和最后一块应该是第一块和最后一块对应的。在我编写的代码中,它同时发送请求,所以块有时会以错误的顺序处理
我想用纯rx来做,但我不能用rx来达到预期的效果。有没有人能帮我安排一下,方法和顺序
谢谢
或者使用我上面列出的方法是一种错误的方法
UPD:我想象代码是这样的:
rx.Observable.from(image.getChunks())
.flatMap(chunk -> return api.upload(chunk))
.subscribe(resp -> {}, err -> {} );
rx.Observable.from(image.getChunks())
.first()
.map(firstChunk -> return api.upload(firstChunk))
.subscribe(
resp -> {
rx.Observable.from(image.getChunks())
.skip(1)
.skipLast(1)
.flatMap(chunk -> return api.upload(chunk))
.subscribe(
resp -> {},
err -> {},
() -> {
rx.Observable.from(image.getChunks())
.last(1)
.map(lastChunk -> {
api.upload(lastChunk).subscribe(
resp -> {
//upload finished
},
err -> {}
)
}
);
},
err -> {}
);
我还没有试着运行这段代码,所以我不确定它是否有效。但这里的问题是我做了三次rx.Observable.from(image.getChunks())
。我想再做一次:
- 消费第一项
- 等待,直到它将被上传
- 使用除最后一个项目外的所有其他项目并同时上载它们
- 等待,直到我收到每个请求的响应
- 消费最后一项并上传它
onComplete()
最后一个请求将在所有项目被消费时触发,但在收到所有响应时不会触发。只需将flatMap
调用替换为concatMap
调用即可concatMap
确保按顺序执行所有观察结果。看起来问题是由服务器而不是客户端发现的。因为请求发送的顺序是正确的,但当服务器以错误的顺序处理请求时,会收到一堆请求。因此,我需要在收到第一个区块的响应后启动所有请求(第一个和最后一个除外),并在收到之前发送的所有响应后启动最后一个请求。您的意思是只应按顺序上载第一个和最后一个区块吗?其余的块可以按任何顺序上传?如果是这样的话,这就是在RxJava
中如何做到的-我更新了我的问题以便更清楚明白明白了。然后,我在要点中提供的代码正好满足您的需要。