请注意,我还在相关的存储库上创建了issue。
在documentation中,它表示此函数将返回一个promise,该诺言将在数组中的所有promise都解决后解决。
这是我的实现;
private function downloadListingImages($contents)
{
$response = [];
$name = 1;
foreach ($contents['images'] as $image) {
$response[] = $this->downloadImage($image, $name);
$name++;
}
return $response;
}
private function downloadImage($link, $name)
{
$guzzle = new Client([
'handler' => HandlerStack::create(new HttpClientAdapter($this->loop)),
]);
$promise = $guzzle->getAsync($link, [
'save_to' => 'assets/' . $name . '.jpg',
]);
return $promise;
}
$promises = $this->downloadListingImages($contents);
现在,到目前为止一切都很好。但是我想做的就是从请求中获取$contents
到我的服务器。所以我有一个服务器实现;
$server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterface $request) use ($promises) {
\React\Promise\all($promises)->always(function($val) {
file_put_contents('meh.txt', "meh");
});
return new React\Http\Response(
200,
array('Content-Type' => 'text/plain'),
"Hello World!\n"
);
});
我在这里期望$server
返回立即响应(确实如此),过了一会儿,在我的仓库中看到meh.txt
。但是,它永远不会属于always
回调。而且,即使我没有在all
方法上链接任何函数,它也只会自行解决。它不应该等到then
或类似的东西被解决吗?工作完成后,如何才能使我的口哨承诺异步并得到通知?
答案 0 :(得分:0)
只要传递给\ React \ Promise \ all的对象都可以实现该方法,它就可以很好地工作。例如。 \ React \ Promise \ All与\ React \ Promise \ Promise()以及\ GuzzleHttp \ Promise \ Promise都可以很好地工作。
到目前为止,我无法重现此问题。
正如您在文档中所看到的,Always-method不接受任何参数。如果需要参数,请考虑使用而不是始终使用。 还应考虑file_put_contents可能会阻止事件循环。
我希望这会有所帮助。