2

我尝试使用MojoX::Redis,但我无法理解 catch 是如何导致变量的。

在使用“打印”的文档中

 $redis->get(key => sub {
      my ($redis, $res) = @_;

      print "Value of ' key ' is $res->[0]\n";
  })

它起作用了,但没用。如何将结果分配给“主”程序中的变量?

PS。事实上,我真的不了解这部分的异步范式。

4

2 回答 2

2

我咨询了作者,他给了我下一个解决方案:

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 循环上,并且只在最后接收数据。

于 2011-02-25T21:44:56.803 回答
2

当请求的数据到达时调用 sub。您可以从外部关闭变量周围的匿名子以对其进行分配。

my $result;

$redis->get(key => sub {
    my ($redis, $res) = @_;
    $result = $res->[0];
});

但是要注意那个变量是异步填充的,所以它不会立即可用。可能最好的方法是在匿名子中处理结果。

于 2011-02-25T20:43:12.173 回答