3

我正在尝试实现类似于事件总线的行为。对于我的要求, aPublishSubject似乎合适。

主题发出表示某些全局操作结果的项目,这些操作可能会成功解决,也可能会在出现异常时失败。我不能onNext()用于成功事件和发生错误的情况下,因为一旦onError()被调用,主题就会终止,并且任何未来的订阅者除了一个之外都不会得到任何排放。ThrowableonError()onError()

现在我看到它的方式我必须创建一个代表事件的类,并且可以选择引用 aThrowable以防出现错误。然而,这似乎是不明智的,因为必须处理内部的错误onNext()

你会怎么做?

4

1 回答 1

4

创建一个通用类包装事件是一种方法。假设我们称之为ResponseOrError类,它基本上应该包含两个字段

private T data;
private Throwable error;

和两个简单​​的工厂方法:

public static <T> ResponseOrError<T> fromError(Throwable throwable) {
    return new ResponseOrError<>(throwable);
}

public static <T> ResponseOrError<T> fromData(T data) {
    return new ResponseOrError<>(data);
}

要删除一些样板代码,您可以提供 Transformer 以使 Observable 成为 ResponseOrError 类型。

public static <T> Observable.Transformer<T, ResponseOrError<T>> toResponseOrErrorObservable() {
    return new Observable.Transformer<T, ResponseOrError<T>>() {

        @Override
        public Observable<ResponseOrError<T>> call(final Observable<T> observable) {
            return observable
                    .map(new Func1<T, ResponseOrError<T>>() {
                        @Override
                        public ResponseOrError<T> call(final T t) {
                            return ResponseOrError.fromData(t);
                        }
                    })
                    .onErrorResumeNext(new Func1<Throwable, Observable<? extends ResponseOrError<T>>>() {
                        @Override
                        public Observable<? extends ResponseOrError<T>> call(final Throwable throwable) {
                            return Observable.just(ResponseOrError.<T>fromError(throwable));
                        }
                    });
        }
    };
}

那么你可以这样使用它:

final Observable<ResponseOrError<ImportantData>> compose = mNetworkService
               .getImportantData()
               .compose(ResponseOrError.<ImportantData>toResponseOrErrorObservable());

现在您可以根据成功或失败轻松映射结果,甚至提供另一个Transformer返回映射的Observable< T>而不是Observable< ResponseOrError< T>>

于 2015-07-29T18:23:20.830 回答