我尝试使用MojoX::Redis,但我无法理解 catch 是如何导致变量的。
在使用“打印”的文档中
$redis->get(key => sub {
my ($redis, $res) = @_;
print "Value of ' key ' is $res->[0]\n";
})
它起作用了,但没用。如何将结果分配给“主”程序中的变量?
PS。事实上,我真的不了解这部分的异步范式。
我尝试使用MojoX::Redis,但我无法理解 catch 是如何导致变量的。
在使用“打印”的文档中
$redis->get(key => sub {
my ($redis, $res) = @_;
print "Value of ' key ' is $res->[0]\n";
})
它起作用了,但没用。如何将结果分配给“主”程序中的变量?
PS。事实上,我真的不了解这部分的异步范式。
我咨询了作者,他给了我下一个解决方案:
my $data_out;
my $redis = $redis->ioloop(Mojo::IOLoop->new);
$redis->get( $user_query => sub {
my ($redis, $res) = @_;
$data_out = $res->[0];
$redis->stop;
});
$redis->start;
$self->render( text => "|$data_out|" );
要点全文
我想如果没有新的 ioloop,Redis 就会“定位”在 Mojolicious 循环上,并且只在最后接收数据。
当请求的数据到达时调用 sub。您可以从外部关闭变量周围的匿名子以对其进行分配。
my $result;
$redis->get(key => sub {
my ($redis, $res) = @_;
$result = $res->[0];
});
但是要注意那个变量是异步填充的,所以它不会立即可用。可能最好的方法是在匿名子中处理结果。