39 lines
1.3 KiB
GDScript3
39 lines
1.3 KiB
GDScript3
|
|
## Returns an observable sequence that invokes the specified factory
|
||
|
|
## function whenever a new observer subscribes.
|
||
|
|
## [br]
|
||
|
|
## [b]Example:[/b]
|
||
|
|
## [codeblock]
|
||
|
|
## var res = GDRx.obs.defer(func(scheduler): return GDRx.of([1, 2, 3]))
|
||
|
|
## [/codeblock]
|
||
|
|
## [br]
|
||
|
|
## [b]Args:[/b]
|
||
|
|
## [br]
|
||
|
|
## [code]observable_factory[/code] Observable factory function to invoke for
|
||
|
|
## each observer that subscribes to the resulting sequence. The
|
||
|
|
## factory takes a single argument, the scheduler used.
|
||
|
|
## [br][br]
|
||
|
|
## [b]Returns:[/b]
|
||
|
|
## [br]
|
||
|
|
## An observable sequence whose observers trigger an invocation
|
||
|
|
## of the given observable factory function.
|
||
|
|
static func defer_(factory : Callable = GDRx.basic.default_factory) -> Observable:
|
||
|
|
|
||
|
|
var subscribe = func(
|
||
|
|
observer : ObserverBase,
|
||
|
|
scheduler : SchedulerBase = null
|
||
|
|
) -> DisposableBase:
|
||
|
|
|
||
|
|
var result = RefValue.Null()
|
||
|
|
var failed = RefValue.Null()
|
||
|
|
if GDRx.try(func():
|
||
|
|
result.v = factory.call(scheduler if scheduler != null else ImmediateScheduler.singleton())
|
||
|
|
) \
|
||
|
|
.catch("Error", func(err):
|
||
|
|
failed.v = GDRx.obs.throw(err).subscribe(observer)
|
||
|
|
) \
|
||
|
|
.end_try_catch():
|
||
|
|
return failed.v
|
||
|
|
return result.v.subscribe(observer, GDRx.basic.noop, GDRx.basic.noop, scheduler)
|
||
|
|
|
||
|
|
return Observable.new(subscribe)
|