22
33namespace React \Dns \Query ;
44
5+ use React \Promise \Deferred ;
6+ use React \Promise \When ;
7+
58class RetryExecutor implements ExecutorInterface
69{
710 private $ executor ;
@@ -16,28 +19,34 @@ public function __construct(ExecutorInterface $executor, $retries = 2)
1619
1720 public function query ($ nameserver , Query $ query )
1821 {
19- return $ this ->tryQuery ($ nameserver , $ query , $ this ->retries );
22+ $ deferred = new Deferred ();
23+
24+ $ this ->tryQuery ($ nameserver , $ query , $ this ->retries , $ deferred ->resolver ());
25+
26+ return $ deferred ->promise ();
2027 }
2128
22- public function tryQuery ($ nameserver , Query $ query , $ retries )
29+ public function tryQuery ($ nameserver , Query $ query , $ retries, $ resolver )
2330 {
2431 $ that = $ this ;
25- $ errorback = function ($ error ) use ($ nameserver , $ query , $ retries , $ that ) {
32+ $ errorback = function ($ error ) use ($ nameserver , $ query , $ retries , $ resolver , $ that ) {
2633 if (!$ error instanceof TimeoutException) {
27- return $ error ;
34+ $ resolver ->reject ($ error );
35+ return ;
2836 }
2937 if (0 >= $ retries ) {
3038 $ error = new \RuntimeException (
3139 sprintf ("DNS query for %s failed: too many retries " , $ query ->name ),
3240 0 ,
3341 $ error
3442 );
35- return $ error ;
43+ $ resolver ->reject ($ error );
44+ return ;
3645 }
37- return $ that ->tryQuery ($ nameserver , $ query , $ retries -1 );
46+ $ that ->tryQuery ($ nameserver , $ query , $ retries -1 , $ resolver );
3847 };
3948
40- return $ this ->executor ->query ($ nameserver , $ query, $ errorback )
41- ->then (null , $ errorback );
49+ $ this ->executor ->query ($ nameserver , $ query )
50+ ->then (array ( $ resolver , ' resolve ' ) , $ errorback );
4251 }
4352}
0 commit comments