diff --git a/docs/reference_factory.md b/docs/reference_factory.md index bed3bc0..c98f69d 100644 --- a/docs/reference_factory.md +++ b/docs/reference_factory.md @@ -26,7 +26,8 @@ | **CreateFrom**(`Func>` factory) | `Observable` | | **CreateFrom**(`TState` state, `Func>` factory) | `Observable` | | **Defer**(`Func>` observableFactory, `Boolean` rawObserver = false) | `Observable` | -| **Empty**() | `Observable` | +| **Defer**(`TState` state, `Func>` observableFactory, `Boolean` rawObserver = false) | `Observable` | +| **Empty**() | `Observable` | | **Empty**(`TimeProvider` timeProvider) | `Observable` | | **Empty**(`TimeSpan` dueTime, `TimeProvider` timeProvider) | `Observable` | | **EveryUpdate**() | `Observable` | diff --git a/src/R3/Factories/Defer.cs b/src/R3/Factories/Defer.cs index b837a7f..93c92bc 100644 --- a/src/R3/Factories/Defer.cs +++ b/src/R3/Factories/Defer.cs @@ -6,6 +6,11 @@ public static Observable Defer(Func> observableFactory, bool { return new Defer(observableFactory, rawObserver); } + + public static Observable Defer(TState state, Func> observableFactory, bool rawObserver = false) + { + return new Defer(state, observableFactory, rawObserver); + } } internal sealed class Defer(Func> observableFactory, bool rawObserver) : Observable @@ -26,3 +31,22 @@ protected override IDisposable SubscribeCore(Observer observer) return observable.Subscribe(rawObserver ? observer : observer.Wrap()); } } + +internal sealed class Defer(TState state, Func> observableFactory, bool rawObserver) : Observable +{ + protected override IDisposable SubscribeCore(Observer observer) + { + var observable = default(Observable); + try + { + observable = observableFactory(state); + } + catch (Exception ex) + { + observer.OnCompleted(ex); // when failed, return Completed(Error) + return Disposable.Empty; + } + + return observable.Subscribe(rawObserver ? observer : observer.Wrap()); + } +}