使用狂饮承诺asyncronously
问题描述:
我试图使用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调用
答
使用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();
主要的问题是http调用使得各种函数调用下来的兔子洞。理想情况下,我希望能够将我的'doHttpCallAndReturn();'包装在承诺中,并在准备好时获取响应。 – Rich
这是不是只是重申没有回答它的问题?我认为最初的问题是如何等待多重承诺,所有承诺都是异步发起的,预计可能会以任何顺序完成。 – Jason
@你有想过吗? –