53
53
function await (PromiseInterface $ promise )
54
54
{
55
55
$ wait = true ;
56
- $ resolved = null ;
57
- $ exception = null ;
56
+ $ resolved = false ;
58
57
$ rejected = false ;
58
+ $ resolvedValue = null ;
59
+ $ rejectedThrowable = null ;
59
60
60
61
$ promise ->then (
61
- function ($ c ) use (&$ resolved , &$ wait ) {
62
- $ resolved = $ c ;
62
+ function ($ c ) use (&$ resolved , &$ resolvedValue , &$ wait ) {
63
+ $ resolvedValue = $ c ;
64
+ $ resolved = true ;
63
65
$ wait = false ;
64
66
Loop::stop ();
65
67
},
66
- function ($ error ) use (&$ exception , &$ rejected , &$ wait ) {
67
- $ exception = $ error ;
68
+ function ($ error ) use (&$ rejected , &$ rejectedThrowable , &$ wait ) {
69
+ $ rejectedThrowable = $ error ;
68
70
$ rejected = true ;
69
71
$ wait = false ;
70
72
Loop::stop ();
@@ -75,24 +77,40 @@ function ($error) use (&$exception, &$rejected, &$wait) {
75
77
// argument does not show up in the stack trace in PHP 7+ only.
76
78
$ promise = null ;
77
79
80
+ if ($ rejected ) {
81
+ awaitThrow ($ rejectedThrowable );
82
+ }
83
+
84
+ if ($ resolved ) {
85
+ return $ resolvedValue ;
86
+ }
87
+
78
88
while ($ wait ) {
79
89
Loop::run ();
80
90
}
81
91
82
92
if ($ rejected ) {
83
- // promise is rejected with an unexpected value (Promise API v1 or v2 only)
84
- if (!$ exception instanceof \Throwable) {
85
- $ exception = new \UnexpectedValueException (
86
- 'Promise rejected with unexpected value of type ' . (is_object ($ exception ) ? get_class ($ exception ) : gettype ($ exception ))
87
- );
88
- }
89
-
90
- throw $ exception ;
93
+ awaitThrow ($ rejectedThrowable );
91
94
}
92
95
93
- return $ resolved ;
96
+ return $ resolvedValue ;
94
97
}
95
98
99
+ /**
100
+ * @internal
101
+ * @param \Exception|\Throwable $rejectedThrowable
102
+ */
103
+ function awaitThrow ($ rejectedThrowable )
104
+ {
105
+ // promise is rejected with an unexpected value (Promise API v1 or v2 only)
106
+ if (!$ rejectedThrowable instanceof \Exception && !$ rejectedThrowable instanceof \Throwable) {
107
+ $ rejectedThrowable = new \UnexpectedValueException (
108
+ 'Promise rejected with unexpected value of type ' . (is_object ($ rejectedThrowable ) ? get_class ($ rejectedThrowable ) : gettype ($ rejectedThrowable ))
109
+ );
110
+ }
111
+
112
+ throw $ rejectedThrowable ;
113
+ }
96
114
97
115
/**
98
116
* Execute a Generator-based coroutine to "await" promises.
0 commit comments