2011-02-25 91 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