【发布时间】:2022-05-11 22:30:17
【问题描述】:
我有以下测试php代码:
use React\EventLoop\Loop;
$loop = Loop::get();
$reason = "unknown";
\Ratchet\Client\connect('wss://demo.piesocket.com/v3/channel_1?api_key=VCXCEuvhGcBDP7XhiJJUDvR1e1D3eiVjgZ9VRiaV¬ify_self', [], [], $loop)->then(function($conn) use ($loop, &$reason){
$conn->on('message', function($msg) use ($loop, $conn, &$reason){
echo $msg."\n";
if ($msg == "quit") {
$conn->close();
$loop->stop();
$reason = "quit";
}
});
}, function ($e) {
echo "Could not connect: {$e->getMessage()}\n";
});
echo "the echo $reason\n";
该代码大部分工作,它连接到 websocket 并在命令行上打印通过 websocket 发送的消息。此外,当我发送退出时,它会停止连接并且脚本结束。
然而,脚本中的最后一个回声,即“回声 $reason”回声,是在脚本启动的第一件事上打印出来的。我想以某种方式等待 websocket 完成,然后运行 echo 语句。我该怎么做呢?
最后,websocket 代码将成为更大脚本的一个小子程序。我希望更大的脚本等待子例程完成。
【问题讨论】:
-
很简单:将
echo "the echo $reason\n";放入if ($msg == "quit") {...就像您在发出“退出”命令并已经放置在那里时期望运行的所有其他代码一样。也许我错过了一些东西,但我不确定为什么这是一个难题? -
I want the bigger script to wait for the subroutine to finish....再次简单:发出“退出”命令后应该发生的任何事情都必须在我上面提到的if块内 - 或从调用的函数内。 PHP 没有其他方法可以知道此事件已发生。由于它都是异步的(或至少是伪异步的),因此您不能期望其他代码等待事件。相反,重新考虑该方法并对其进行设计,以便在事件发生时触发后续任务,而不是尝试“等待”来自外部代码块的事件。 -
How to return the response from an asynchronous call 主要是在谈论 JavaScript,但所谈论的原则和逻辑在这里同样适用。