Skip to content

Commit af6765a

Browse files
davidwdanmbonneau
authored andcommitted
Immediately complete if the iterator is no longer valid (#189)
Fixes #188
1 parent 7967294 commit af6765a

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

src/Observable/IteratorObservable.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ protected function _subscribe(ObserverInterface $observer): DisposableInterface
2727

2828
$action = function ($reschedule) use (&$observer, &$key) {
2929
try {
30-
if (null === $key) {
30+
if (null === $key || !$this->items->valid()) {
3131

3232
if ($this->items instanceof \Generator && $this->items->getReturn()) {
3333
$observer->onNext($this->items->getReturn());

test/Rx/Functional/Observable/IteratorObservableTest.php

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
<?php
22

3-
declare(strict_types = 1);
3+
declare(strict_types=1);
44

55
namespace Rx\Functional\Observable;
66

77
use Rx\Functional\FunctionalTestCase;
88
use Rx\Observable;
99
use Rx\Observable\IteratorObservable;
10+
use Rx\Testing\MockObserver;
1011

1112
class IteratorObservableTest extends FunctionalTestCase
1213
{
@@ -120,6 +121,76 @@ public function it_schedules_all_elements_from_the_generator_with_return()
120121
], $results->getMessages());
121122
}
122123

124+
/**
125+
* @test
126+
* RxPHP Issue 188
127+
*/
128+
public function it_completes_if_subscribed_second_time_without_return_value()
129+
{
130+
$generator = $this->genOneToThree();
131+
132+
$results1 = new MockObserver($this->scheduler);
133+
134+
$this->scheduler->scheduleAbsolute(200, function () use ($generator, $results1) {
135+
Observable::fromIterator($generator, $this->scheduler)->subscribe($results1);
136+
});
137+
138+
$results2 = new MockObserver($this->scheduler);
139+
140+
$this->scheduler->scheduleAbsolute(400, function () use ($generator, $results2) {
141+
Observable::fromIterator($generator, $this->scheduler)->subscribe($results2);
142+
});
143+
144+
$this->scheduler->start();
145+
146+
$this->assertMessages([
147+
onNext(201, 1),
148+
onNext(202, 2),
149+
onNext(203, 3),
150+
onCompleted(204),
151+
], $results1->getMessages());
152+
153+
$this->assertMessages([
154+
onCompleted(401),
155+
], $results2->getMessages());
156+
}
157+
158+
/**
159+
* @test
160+
* RxPHP Issue 188
161+
*/
162+
public function it_returns_value_if_subscribed_second_time_with_return_value()
163+
{
164+
$generator = $this->genOneToThreeAndReturn();
165+
166+
$results1 = new MockObserver($this->scheduler);
167+
168+
$this->scheduler->scheduleAbsolute(200, function () use ($generator, $results1) {
169+
Observable::fromIterator($generator, $this->scheduler)->subscribe($results1);
170+
});
171+
172+
$results2 = new MockObserver($this->scheduler);
173+
174+
$this->scheduler->scheduleAbsolute(400, function () use ($generator, $results2) {
175+
Observable::fromIterator($generator, $this->scheduler)->subscribe($results2);
176+
});
177+
178+
$this->scheduler->start();
179+
180+
$this->assertMessages([
181+
onNext(201, 1),
182+
onNext(202, 2),
183+
onNext(203, 3),
184+
onNext(204, 10),
185+
onCompleted(204),
186+
], $results1->getMessages());
187+
188+
$this->assertMessages([
189+
onNext(401,10),
190+
onCompleted(401),
191+
], $results2->getMessages());
192+
}
193+
123194
private function genOneToThree()
124195
{
125196
for ($i = 1; $i <= 3; $i++) {

0 commit comments

Comments
 (0)