11 use React\Promise\Deferred
;
16 class Call
extends Deferred
implements SplObserver
31 * The executed request
37 * The promised response
43 * Create a deferred promise for the response of $request
45 * @param API $api The endpoint of the request
46 * @param Client $client The HTTP client to send the request
47 * @param Request $request The request to execute
49 function __construct(API
$api, Client
$client, Request
$request) {
51 $this->client
= $client;
52 $this->request
= $request;
54 parent
::__construct(function($resolve, $reject) {
55 return $this->cancel($resolve, $reject);
58 $client->attach($this);
59 $client->enqueue($request);
67 * Import the response's data on success and resolve the promise.
69 * @param SplSubject $client The observed HTTP client
70 * @param Request $request The request which generated the update
71 * @param object $progress The progress information
73 function update(SplSubject
$client, Request
$request = null, $progress = null) {
74 if ($request !== $this->request
) {
78 $this->notify((object) compact("client", "request", "progress"));
80 if ($progress->info
=== "finished") {
81 $this->response
= $this->client
->getResponse();
91 * @param callable $resolve
92 * @param callable $reject
94 private function complete(callable
$resolve, callable
$reject) {
95 $this->client
->detach($this);
97 if ($this->response
) {
99 $resolve($this->api
->import($this->response
));
100 } catch (Exception
$e) {
104 $reject($this->client
->getTransferInfo($this->request
)["error"]);
107 $this->client
->dequeue($this->request
);
111 * Cancellation callback
112 * @param callable $resolve
113 * @param callable $reject
115 private function cancel(callable
$resolve, callable
$reject) {
116 /* did we finish in the meantime? */
117 if ($this->response
) {
118 $this->complete($resolve, $reject);
120 $this->client
->detach($this);
121 $this->client
->dequeue($this->request
);
122 $reject("Cancelled");