22
33namespace Rx \React ;
44
5- use React \Promise \CancellablePromiseInterface ;
65use React \Promise \Promise as ReactPromise ;
76use React \Promise \PromiseInterface ;
87use Rx \Disposable \CallbackDisposable ;
1110use Rx \Observable \AnonymousObservable ;
1211use Rx \Subject \AsyncSubject ;
1312use React \Promise \Deferred ;
13+ use Throwable ;
1414
15+ /**
16+ * @template T
17+ */
1518final class Promise
1619{
1720 /**
18- * @param mixed $value
19- * @return ReactPromise A promise resolved to $value
21+ * @param T $value
22+ * @return PromiseInterface<T> A promise resolved to $value
2023 */
2124 public static function resolved ($ value ): ReactPromise
2225 {
@@ -27,21 +30,21 @@ public static function resolved($value): ReactPromise
2730
2831 /**
2932 * @param mixed $exception
30- * @return ReactPromise A promise rejected with $exception
33+ * @return PromiseInterface<never> A promise rejected with $exception
3134 */
3235 public static function rejected ($ exception ): ReactPromise
3336 {
3437 $ d = new Deferred ();
35- $ d ->reject ($ exception );
38+ $ d ->reject ($ exception instanceof Throwable ? $ exception : new RejectedPromiseException ( $ exception ) );
3639 return $ d ->promise ();
3740 }
3841
3942 /**
4043 * Converts an existing observable sequence to React Promise
4144 *
42- * @param ObservableInterface $observable
45+ * @param ObservableInterface<T> $observable
4346 * @param Deferred $deferred
44- * @return ReactPromise
47+ * @return ReactPromise<T>
4548 * @throws \InvalidArgumentException
4649 */
4750 public static function fromObservable (ObservableInterface $ observable , Deferred $ deferred = null ): ReactPromise
@@ -94,7 +97,7 @@ function ($error) use ($subject) {
9497 $ disp = $ subject ->subscribe ($ observer );
9598 return new CallbackDisposable (function () use ($ p , $ disp ) {
9699 $ disp ->dispose ();
97- if ($ p instanceof CancellablePromiseInterface ) {
100+ if (\method_exists ( $ p , ' cancel ' ) ) {
98101 $ p ->cancel ();
99102 }
100103 });
0 commit comments