2011-02-25 6 views
2

나는 MojoX::Redis와 함께 작업을 시도하고 어떻게 변수를 잡을 수 있는지 이해할 수 없다. 문서에서어떻게 MojoX :: Redis 결과를 변수에 할당합니까?

는 "인쇄"

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

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

하지만 쓸모를 사용했다. "main"프로그램의 변수에 어떻게 결과를 할당 할 수 있습니까?

추신. 실제로 저는이 부분에서 비동기 패러다임을 이해하지 못합니다.

답변

2

요청 된 데이터가 도착하면 sub가 호출됩니다. 익명의 변수를 외부에서 닫아 할당 할 수 있습니다.

그러나 변수가 비동기 적으로 채워 지므로 즉시 사용할 수 없습니다. 아마도 최상의 접근 방식은 익명 하위 내에서 결과를 처리하는 것입니다.

+0

mojolicious에서 데이터를 수신하기 전에 렌더링을 얻습니다. 아래에 나와있는 것처럼 IOloop을 만드는 것이 필요합니다. – Meettya

2

내가 저자와 상담 그는 나에게 다음 솔루션 제공 : 레디 스가 Mojolicious 루프의 "위치를 차지"입니다

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없이 및 끝에서 데이터를 수신 만 .

+0

이 대답을보다 명확하게하기 위해서는 위의'$ data_out' 정의를 추가해야 할 것입니다. 이 접근법은 효과적으로 블로킹을 만듭니다. 데이터가 수신 될 때까지 대기 한 다음 루프를 중지합니다. – bvr

+0

고맙습니다. $ data_out 정의를 수정하십시오. BTW, 나는 AnyEvent :: Redis를 사용할 것이다. 그것은 나를 위해 더 영리하고 잘 알려진 해결책처럼 보인다. – Meettya