Skip to content

Commit 37839a4

Browse files
authored
Merge pull request #210 from WyriHaximus-secret-labs/ObservableFactoryWrapper-should-convert-promise-to-observable
ObservableFactoryWrapper should convert promise to observable
2 parents 851913a + 732c1fd commit 37839a4

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

src/ObservableFactoryWrapper.php

+7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
namespace Rx;
66

7+
use React\Promise\PromiseInterface;
8+
use Rx\React\Promise;
9+
710
final class ObservableFactoryWrapper
811
{
912
private $selector;
@@ -17,6 +20,10 @@ public function __invoke(): Observable
1720
{
1821
$result = call_user_func_array($this->selector, func_get_args());
1922

23+
if ($result instanceof PromiseInterface) {
24+
$result = Promise::toObservable($result);
25+
}
26+
2027
if (!$result instanceof ObservableInterface) {
2128
$reflectCallable = new \ReflectionFunction($this->selector);
2229
throw new \Exception("You must return an Observable or Promise in {$reflectCallable->getFileName()} on line {$reflectCallable->getStartLine()}\n");
+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
declare(strict_types = 1);
4+
5+
namespace Rx;
6+
7+
use React\Promise\PromiseInterface;
8+
use function React\Promise\resolve;
9+
10+
class ObservableFactoryWrapperTest extends TestCase
11+
{
12+
public function testPromiseIsConvertedToObservable()
13+
{
14+
$afw = new ObservableFactoryWrapper(static function (): PromiseInterface {
15+
return resolve(true);
16+
});
17+
$true = null;
18+
$afw()->subscribe(function ($v) use (&$true) {
19+
$true = $v;
20+
});
21+
22+
self::assertTrue($true);
23+
}
24+
25+
public function testObservable()
26+
{
27+
$afw = new ObservableFactoryWrapper(static function (): Observable {
28+
return Observable::fromArray([true], Scheduler::getImmediate());
29+
});
30+
$true = null;
31+
$afw()->subscribe(function ($v) use (&$true) {
32+
$true = $v;
33+
});
34+
35+
self::assertTrue($true);
36+
}
37+
38+
public function testNotAnObservableOrPromise()
39+
{
40+
self::expectException(\Exception::class);
41+
self::expectExceptionMessageMatches('/You must return an Observable or Promise in/');
42+
43+
$afw = new ObservableFactoryWrapper(static function (): bool {
44+
return true;
45+
});
46+
$afw();
47+
}
48+
}

0 commit comments

Comments
 (0)