2016-05-23 87 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

@你有想過嗎? –