2016-05-23 94 views
3

我试图使用guzzle promises为了使一些HTTP调用,来说明我有什么,我做了这个简单的例子,其中一个假的http请求将需要5秒:使用狂饮承诺asyncronously

$then = microtime(true); 

$promise = new Promise(
    function() use (&$promise) { 
     //Make a request to an http server 
     $httpResponse = 200; 
     sleep(5); 
     $promise->resolve($httpResponse); 
    }); 

$promise2 = new Promise(
    function() use (&$promise2) { 
     //Make a request to an http server 
     $httpResponse = 200; 
     sleep(5); 
     $promise2->resolve($httpResponse); 
    }); 

echo 'PROMISE_1 ' . $promise->wait(); 
echo 'PROMISE_2 ' . $promise2->wait(); 

echo 'Took: ' . (microtime(true) - $then); 

现在我想要做的就是启动它们,然后使两个回声等待响应。实际发生的是诺言1发射,等待5秒然后发射诺言2并等待5秒。

从我的理解也许我应该使用一个承诺的->resolve();功能,使之开始,但我不知道如何通过解决一个函数中,我将成为一个HTTP调用

回答

5

使用wait()你”再迫使承诺要同步解决:https://github.com/guzzle/promises#synchronous-wait

按照Guzzle FAQ你应该使用requestAsync()您的RESTful电话:

可以狂饮发送非同步ronous请求?

是的。您可以使用客户端 的putAsync,sendAsync,getAsync,headAsync, putAsync,postAsync,deleteAsync和patchAsync方法发送异步请求。客户端将返回一个 GuzzleHttp \ Promise \ PromiseInterface对象。你可以链接那么功能脱离诺言。

$promise = $client->requestAsync('GET', 'http://httpbin.org/get'); 
$promise->then(function ($response) { 
echo 'Got a response! ' . $response->getStatusCode(); }); 

可以强制异步响应使用wait()的 返回的承诺的方法来完成。

$promise = $client->requestAsync('GET', 'http://httpbin.org/get'); 
$response = $promise->wait(); 
+0

主要的问题是http调用使得各种函数调用下来的兔子洞。理想情况下,我希望能够将我的'doHttpCallAndReturn();'包装在承诺中,并在准备好时获取响应。 – Rich

+0

这是不是只是重申没有回答它的问题?我认为最初的问题是如何等待多重承诺,所有承诺都是异步发起的,预计可能会以任何顺序完成。 – Jason

+0

@你有想过吗? –