改型和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())
。我想再做一次:

  • 消费第一项
  • 等待,直到它将被上传
  • 使用除最后一个项目外的所有其他项目并同时上载它们
  • 等待,直到我收到每个请求的响应
  • 消费最后一项并上传它
有可能吗

UPD#2:

我在周末意识到我编写的代码示例无法按预期工作。
onComplete()
最后一个请求将在所有项目被消费时触发,但在收到所有响应时不会触发。

只需将
flatMap
调用替换为
concatMap
调用即可
concatMap
确保按顺序执行所有观察结果。看起来问题是由服务器而不是客户端发现的。因为请求发送的顺序是正确的,但当服务器以错误的顺序处理请求时,会收到一堆请求。因此,我需要在收到第一个区块的响应后启动所有请求(第一个和最后一个除外),并在收到之前发送的所有响应后启动最后一个请求。您的意思是只应按顺序上载第一个和最后一个区块吗?其余的块可以按任何顺序上传?如果是这样的话,这就是在
RxJava
中如何做到的-我更新了我的问题以便更清楚明白明白了。然后,我在要点中提供的代码正好满足您的需要。