Skip to content

Commit 5417a38

Browse files
committed
Merge remote-tracking branch 'origin/fix-recursion'
* origin/fix-recursion: Revert resolution related methods to not use Deferred Revert "Some refactoring to prevent infinite loops"
2 parents c6c759d + 74ab127 commit 5417a38

2 files changed

Lines changed: 29 additions & 60 deletions

File tree

src/React/Promise/Deferred.php

Lines changed: 28 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -12,66 +12,43 @@ class Deferred implements PromiseInterface, ResolverInterface
1212

1313
public function then($fulfilledHandler = null, $errorHandler = null, $progressHandler = null)
1414
{
15+
if (null !== $this->completed) {
16+
return $this->completed->then($fulfilledHandler, $errorHandler, $progressHandler);
17+
}
18+
1519
$deferred = new static();
1620

17-
if (null !== $this->completed) {
18-
$completed = $this->completed;
19-
20-
$this->executeCallback(function () use ($completed, $fulfilledHandler, $errorHandler, $deferred) {
21-
$completed
22-
->then($fulfilledHandler, $errorHandler)
23-
->then(
24-
function ($value) use ($deferred) {
25-
$deferred->resolve($value);
26-
},
27-
function ($reason) use ($deferred) {
28-
$deferred->reject($reason);
29-
},
30-
function ($update) use ($deferred) {
31-
$deferred->progress($update);
32-
}
33-
);
34-
});
35-
} else {
36-
if ($progressHandler) {
37-
$progHandler = function ($update) use ($deferred, $progressHandler) {
38-
try {
39-
$deferred->progress(call_user_func($progressHandler, $update));
40-
} catch (\Exception $e) {
41-
$deferred->progress($e);
42-
}
43-
};
44-
} else {
45-
$progHandler = array($deferred, 'progress');
46-
}
47-
48-
$this->handlers[] = function ($promise) use ($fulfilledHandler, $errorHandler, $deferred, $progHandler) {
49-
$promise
50-
->then($fulfilledHandler, $errorHandler)
51-
->then(
52-
function ($value) use ($deferred) {
53-
$deferred->resolve($value);
54-
},
55-
function ($reason) use ($deferred) {
56-
$deferred->reject($reason);
57-
},
58-
$progHandler
59-
);
21+
if ($progressHandler) {
22+
$progHandler = function ($update) use ($deferred, $progressHandler) {
23+
try {
24+
$deferred->progress(call_user_func($progressHandler, $update));
25+
} catch (\Exception $e) {
26+
$deferred->progress($e);
27+
}
6028
};
61-
62-
$this->progressHandlers[] = $progHandler;
29+
} else {
30+
$progHandler = array($deferred, 'progress');
6331
}
6432

33+
$this->handlers[] = function ($promise) use ($fulfilledHandler, $errorHandler, $deferred, $progHandler) {
34+
$promise
35+
->then($fulfilledHandler, $errorHandler)
36+
->then(
37+
array($deferred, 'resolve'),
38+
array($deferred, 'reject'),
39+
$progHandler
40+
);
41+
};
42+
43+
$this->progressHandlers[] = $progHandler;
44+
6545
return $deferred->promise();
6646
}
6747

6848
public function resolve($result = null)
6949
{
7050
if (null !== $this->completed) {
71-
$deferred = new static();
72-
$deferred->resolve($result);
73-
74-
return $deferred->promise();
51+
return Util::promiseFor($result);
7552
}
7653

7754
$this->completed = Util::promiseFor($result);
@@ -80,7 +57,7 @@ public function resolve($result = null)
8057

8158
$this->progressHandlers = $this->handlers = array();
8259

83-
return $this->promise();
60+
return $this->completed;
8461
}
8562

8663
public function reject($reason = null)
@@ -118,12 +95,7 @@ public function resolver()
11895
protected function processQueue($queue, $value)
11996
{
12097
foreach ($queue as $handler) {
121-
$this->executeCallback($handler, array($value));
98+
call_user_func($handler, $value);
12299
}
123100
}
124-
125-
protected function executeCallback($callback, array $args = array())
126-
{
127-
call_user_func_array($callback, $args);
128-
}
129101
}

src/React/Promise/When.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ class When
66
{
77
public static function resolve($promiseOrValue)
88
{
9-
$deferred = new Deferred();
10-
$deferred->resolve($promiseOrValue);
11-
12-
return $deferred->promise();
9+
return Util::promiseFor($promiseOrValue);
1310
}
1411

1512
public static function reject($promiseOrValue)

0 commit comments

Comments
 (0)