Codebase list php-react-promise / d76ba7b
Merge pull request #238 from clue-labs/dequeue Remove internal `Queue` leftovers Cees-Jan Kiewiet authored 1 year, 7 months ago GitHub committed 1 year, 7 months ago
5 changed file(s) with 10 addition(s) and 136 deletion(s). Raw diff Collapse all Expand all
11
22 namespace React\Promise\Internal;
33
4 use React\Promise\Promise;
54 use React\Promise\PromiseInterface;
6 use function React\Promise\enqueue;
75 use function React\Promise\resolve;
86
97 /**
2826 return $this;
2927 }
3028
31 return new Promise(function (callable $resolve, callable $reject) use ($onFulfilled): void {
32 enqueue(function () use ($resolve, $reject, $onFulfilled): void {
33 try {
34 $resolve($onFulfilled($this->value));
35 } catch (\Throwable $exception) {
36 $reject($exception);
37 }
38 });
39 });
29 try {
30 return resolve($onFulfilled($this->value));
31 } catch (\Throwable $exception) {
32 return new RejectedPromise($exception);
33 }
4034 }
4135
4236 public function catch(callable $onRejected): PromiseInterface
+0
-30
src/Internal/Queue.php less more
0 <?php
1
2 namespace React\Promise\Internal;
3
4 /**
5 * @internal
6 */
7 final class Queue
8 {
9 private $queue = [];
10
11 public function enqueue(callable $task): void
12 {
13 if (1 === \array_push($this->queue, $task)) {
14 $this->drain();
15 }
16 }
17
18 private function drain(): void
19 {
20 for ($i = \key($this->queue); isset($this->queue[$i]); $i++) {
21 $task = $this->queue[$i];
22 unset($this->queue[$i]);
23
24 $task();
25 }
26
27 $this->queue = [];
28 }
29 }
11
22 namespace React\Promise\Internal;
33
4 use React\Promise\Promise;
54 use React\Promise\PromiseInterface;
65 use function React\Promise\_checkTypehint;
7 use function React\Promise\enqueue;
86 use function React\Promise\resolve;
97
108 /**
2523 return $this;
2624 }
2725
28 return new Promise(function (callable $resolve, callable $reject) use ($onRejected): void {
29 enqueue(function () use ($resolve, $reject, $onRejected): void {
30 try {
31 $resolve($onRejected($this->reason));
32 } catch (\Throwable $exception) {
33 $reject($exception);
34 }
35 });
36 });
26 try {
27 return resolve($onRejected($this->reason));
28 } catch (\Throwable $exception) {
29 return new RejectedPromise($exception);
30 }
3731 }
3832
3933 public function catch(callable $onRejected): PromiseInterface
202202 ));
203203 }
204204 }, $cancellationQueue);
205 }
206
207 /**
208 * @internal
209 */
210 function enqueue(callable $task): void
211 {
212 static $queue;
213
214 if (!$queue) {
215 $queue = new Internal\Queue();
216 }
217
218 $queue->enqueue($task);
219205 }
220206
221207 /**
+0
-70
tests/Internal/QueueTest.php less more
0 <?php
1
2 namespace React\Promise\Internal;
3
4 use Exception;
5 use React\Promise\TestCase;
6
7 class QueueTest extends TestCase
8 {
9 /** @test */
10 public function executesTasks()
11 {
12 $queue = new Queue();
13
14 $queue->enqueue($this->expectCallableOnce());
15 $queue->enqueue($this->expectCallableOnce());
16 }
17
18 /** @test */
19 public function executesNestedEnqueuedTasks()
20 {
21 $queue = new Queue();
22
23 $nested = $this->expectCallableOnce();
24
25 $task = function () use ($queue, $nested) {
26 $queue->enqueue($nested);
27 };
28
29 $queue->enqueue($task);
30 }
31
32 /**
33 * @test
34 * @requires PHP 8.1
35 */
36 public function executesFollowingTasksIfPriorTaskSuspendsFiber()
37 {
38 $queue = new Queue();
39
40 $fiber = new \Fiber(function () use ($queue) {
41 $queue->enqueue(function () {
42 \Fiber::suspend(2);
43 });
44 return 1;
45 });
46
47 $ret = $fiber->start();
48 $this->assertEquals(2, $ret);
49
50 $queue->enqueue($this->expectCallableOnce());
51 }
52
53 /**
54 * @test
55 */
56 public function rethrowsExceptionsThrownFromTasks()
57 {
58 $this->expectException(Exception::class);
59 $this->expectExceptionMessage('test');
60 $mock = $this->createCallableMock();
61 $mock
62 ->expects(self::once())
63 ->method('__invoke')
64 ->will(self::throwException(new Exception('test')));
65
66 $queue = new Queue();
67 $queue->enqueue($mock);
68 }
69 }