From 5ebc761cf3780d98b344fd421ba669b9c3c23e7d Mon Sep 17 00:00:00 2001 From: Jan Sorgalla Date: Mon, 24 Oct 2016 13:31:01 +0200 Subject: [PATCH] Use done() if available when resolving foreign thenables --- src/functions.php | 6 +++++ tests/FunctionResolveTest.php | 14 ++++++++++++ tests/fixtures/SimpleRejectedTestDonable.php | 23 ++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 tests/fixtures/SimpleRejectedTestDonable.php diff --git a/src/functions.php b/src/functions.php index 5f55f2ea..c5fd69d1 100644 --- a/src/functions.php +++ b/src/functions.php @@ -15,6 +15,12 @@ function resolve($promiseOrValue = null) $canceller = [$promiseOrValue, 'cancel']; } + if (method_exists($promiseOrValue, 'done')) { + return new Promise(function ($resolve, $reject, $notify) use ($promiseOrValue) { + $promiseOrValue->done($resolve, $reject, $notify); + }, $canceller); + } + return new Promise(function ($resolve, $reject, $notify) use ($promiseOrValue) { $promiseOrValue->then($resolve, $reject, $notify); }, $canceller); diff --git a/tests/FunctionResolveTest.php b/tests/FunctionResolveTest.php index 53126bc0..52605963 100644 --- a/tests/FunctionResolveTest.php +++ b/tests/FunctionResolveTest.php @@ -60,6 +60,20 @@ public function shouldResolveAThenable() ); } + /** @test */ + public function shouldResolveADonable() + { + $this->setExpectedException('\Exception', 'UnhandledRejectionException'); + + $exception = new \Exception('UnhandledRejectionException'); + + $donable = new SimpleRejectedTestDonable($exception); + + resolve($donable) + ->then() + ->done(); + } + /** @test */ public function shouldResolveACancellableThenable() { diff --git a/tests/fixtures/SimpleRejectedTestDonable.php b/tests/fixtures/SimpleRejectedTestDonable.php new file mode 100644 index 00000000..5eb0683a --- /dev/null +++ b/tests/fixtures/SimpleRejectedTestDonable.php @@ -0,0 +1,23 @@ +exception = $exception; + } + + public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) + { + return new self($this->exception); + } + + public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) + { + throw $this->exception; + } +}