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
1 | 1 |
|
2 | 2 |
namespace React\Promise\Internal;
|
3 | 3 |
|
4 | |
use React\Promise\Promise;
|
5 | 4 |
use React\Promise\PromiseInterface;
|
6 | |
use function React\Promise\enqueue;
|
7 | 5 |
use function React\Promise\resolve;
|
8 | 6 |
|
9 | 7 |
/**
|
|
28 | 26 |
return $this;
|
29 | 27 |
}
|
30 | 28 |
|
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 |
}
|
40 | 34 |
}
|
41 | 35 |
|
42 | 36 |
public function catch(callable $onRejected): PromiseInterface
|
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 | |
}
|
1 | 1 |
|
2 | 2 |
namespace React\Promise\Internal;
|
3 | 3 |
|
4 | |
use React\Promise\Promise;
|
5 | 4 |
use React\Promise\PromiseInterface;
|
6 | 5 |
use function React\Promise\_checkTypehint;
|
7 | |
use function React\Promise\enqueue;
|
8 | 6 |
use function React\Promise\resolve;
|
9 | 7 |
|
10 | 8 |
/**
|
|
25 | 23 |
return $this;
|
26 | 24 |
}
|
27 | 25 |
|
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 |
}
|
37 | 31 |
}
|
38 | 32 |
|
39 | 33 |
public function catch(callable $onRejected): PromiseInterface
|
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 | |
}
|