Skip to content

Commit 6cb0ce5

Browse files
committed
Rewrote setup of the errors observable
We were directly looking at `inputs`, this could cause unpredictable execution order under certain conditions, and trigger a `notEnabledError` before execution begins.
1 parent e606d7d commit 6cb0ce5

File tree

1 file changed

+7
-22
lines changed

1 file changed

+7
-22
lines changed

Sources/Action/Action.swift

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,19 @@ public final class Action<Input, Element> {
6161

6262
let enabledSubject = BehaviorSubject<Bool>(value: false)
6363
enabled = enabledSubject.asObservable()
64+
65+
let errorsSubject = PublishSubject<ActionError>()
66+
errors = errorsSubject.asObservable()
6467

6568
executionObservables = inputs
6669
.withLatestFrom(enabled) { $0 }
6770
.flatMap { input, enabled -> Observable<Observable<Element>> in
6871
if enabled {
69-
return Observable.of(workFactory(input).shareReplay(1))
72+
return Observable.of(workFactory(input)
73+
.do(onError: { error in errorsSubject.onNext(.underlyingError(error)) })
74+
.shareReplay(1))
7075
} else {
76+
errorsSubject.onNext(.notEnabled)
7177
return Observable.empty()
7278
}
7379
}
@@ -76,27 +82,6 @@ public final class Action<Input, Element> {
7682
elements = executionObservables
7783
.flatMap { $0.catchError { _ in Observable.empty() } }
7884

79-
let notEnabledError = inputs
80-
.withLatestFrom(enabled)
81-
.flatMap { $0 ? Observable.empty() : Observable.of(ActionError.notEnabled) }
82-
83-
let underlyingError = executionObservables
84-
.flatMap { elements in
85-
return elements
86-
.flatMap { _ in Observable<ActionError>.never() }
87-
.catchError { error in
88-
if let actionError = error as? ActionError {
89-
return Observable.of(actionError)
90-
} else {
91-
return Observable.of(.underlyingError(error))
92-
}
93-
}
94-
}
95-
96-
errors = Observable
97-
.of(notEnabledError, underlyingError)
98-
.merge()
99-
10085
executing = executionObservables.flatMap {
10186
execution -> Observable<Bool> in
10287
let execution = execution

0 commit comments

Comments
 (0)