2011-02-25 101 views
2

我尝试使用MojoX::Redis,我无法理解如何在变量中捕获结果。如何将MojoX :: Redis分配给变量?

在文档中使用 “打印”

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

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

它的工作,但没用。 如何将结果赋值给“main”程序中的变量?

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

回答

2

当请求的数据到达时调用该子集。您可以关闭外部变量的匿名子变量以分配变量。

my $result; 

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

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

+0

在mojolicious我得到呈现前收到数据。正如我展示的那样,创建IOloop是必要的。 – Meettya 2011-02-25 21:38:38

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|"); 

全文在gist

我想,如果没有新的ioloop Redis的是在Mojolicious循环“选址”,并在年底接收数据只。

+0

你可能应该在上面加上'$ data_out'定义来使这个答案更清晰。这种方法可以有效地阻止 - 等待数据被接收,然后停止循环。谢谢 – bvr 2011-02-26 08:48:53

+0

Thanx,修复$ data_out定义。顺便说一句,我将使用AnyEvent :: Redis。对于我来说,它似乎是更聪明,更知名的解决方案。 – Meettya 2011-03-01 23:17:48