0

给定一个接口:

public interface FastlyRxApi {

    @GET("/service/{service_id}/version/{version}/backend")
    Observable<List<Backend>> listBackends(@Path("service_id") String serviceId, @Path("version") String versionId);

    @PUT("/service/{service_id}/version/{version}/backend/{old_name}")
    Observable<Backend> updateBackend(@Path("service_id") String serviceId, @Path("version") String version, @Path("old_name") String oldName, @Body Backend updatedBacked);

}

和一些客户端代码:

Integer expectedFirstByteTimeout = 10000; 

// Use a final array to capture any problem found within our composed Observables
final FastlyEnvException[] t = new FastlyEnvException[1];

fastlyRxApi.listBackends(serviceId, newVersion)
    .flatMap(Observable::fromIterable)
    .filter(backend -> !expectedFirstByteTimeout.equals(backend.getFirstByteTimeout()))
    .flatMap(backend -> {
        backend.setFirstByteTimeout(expectedFirstByteTimeout);
        return fastlyRxApi.updateBackend(serviceId, newVersion, backend.getName(), backend);
    }).subscribe(ignore -> {
}, e -> {
    t[0] = new FastlyEnvException("failed to configure backends", e);
});

if (t[0] != null) {
    throw t[0];
}

使用 final 数组FastlyEnvException来捕获上下文以进行错误处理感觉就像我做错了什么,并且遗漏了某些方面。

我在这里用的是锤子而不是螺丝刀吗?即我应该为此使用 RxJava 吗?除了错误处理之外,它似乎给了我一个很好的可读流程。这样做的首选习惯用法是什么?

4

2 回答 2

1

使用onErrorResumeNext

.onErrorResumeNext(err -> 
     Observable.error(new FastlyEnvException("failed to configure backends", e)))
.toBlocking();
.subscribe();

值得注意的是.toBlocking(),这将使 Observable 链等待完成。

鉴于 subscribe() 没有错误处理程序,它将重新抛出异常。

于 2017-01-20T12:19:00.270 回答
0

只需省略您subscribe()的错误处理程序,错误将自动重新抛出。

于 2017-01-20T12:57:31.460 回答