/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $outerDisposable = new SerialDisposable(); $this->disposable->add($outerDisposable); $subscribe = function () use($outerDisposable, $observable, $observer, $scheduler, &$subscribe) { $this->sourceComplete = false; $outerSubscription = $observable->subscribe(new CallbackObserver([$observer, "onNext"], [$observer, "onError"], function () use($observer, &$subscribe, $outerDisposable) { $this->sourceComplete = true; if (!$this->repeat) { $observer->onCompleted(); return; } $outerDisposable->setDisposable(new EmptyDisposable()); $this->completions->onNext(++$this->count); }), $scheduler); $outerDisposable->setDisposable($outerSubscription); }; $notifierDisposable = $this->notifier->subscribe(new CallbackObserver(function () use(&$subscribe, $scheduler) { $subscribe(); }, function ($ex) use($observer) { $this->repeat = false; $observer->onError($ex); }, function () use($observer) { $this->repeat = false; if ($this->sourceComplete) { $observer->onCompleted(); } }), $scheduler); $this->disposable->add($notifierDisposable); try { $handled = call_user_func($this->notificationHandler, $this->completions->asObservable()); $handledDisposable = $handled->subscribe($this->notifier, $scheduler); $this->disposable->add($handledDisposable); } catch (\Exception $e) { $observer->onError($e); return new EmptyDisposable(); } $subscribe(); return $this->disposable; }
/** * @inheritDoc */ public function __invoke(ObservableInterface $observable, ObserverInterface $observer, SchedulerInterface $scheduler = null) { $errors = new Subject(); $disposable = new CompositeDisposable(); $sourceDisposable = new EmptyDisposable(); $innerCompleted = false; $sourceError = false; try { $when = call_user_func($this->notificationHandler, $errors->asObservable()); } catch (\Exception $e) { $observer->onError($e); return; } $subscribeToSource = function () use($observer, $disposable, $observable, &$sourceError, $errors, &$sourceDisposable, $scheduler, &$innerCompleted) { $sourceError = false; $sourceDisposable = $observable->subscribe(new CallbackObserver([$observer, 'onNext'], function ($err) use(&$sourceError, $errors, $disposable, &$sourceDisposable, &$innerCompleted, $observer) { $sourceError = true; $disposable->remove($sourceDisposable); $sourceDisposable->dispose(); if ($innerCompleted) { $observer->onCompleted(); return; } $errors->onNext($err); }, [$observer, 'onCompleted']), $scheduler); $disposable->add($sourceDisposable); }; $whenDisposable = $when->subscribe(new CallbackObserver(function ($x) use($subscribeToSource, &$sourceError) { if ($sourceError) { $sourceError = false; $subscribeToSource(); } }, [$observer, 'onError'], function () use(&$innerCompleted, &$sourceError, $observer) { $innerCompleted = true; if ($sourceError) { $observer->onCompleted(); } }), $scheduler); $disposable->add($whenDisposable); $subscribeToSource(); return $disposable; }