【问题标题】:How assign MojoX::Redis result to variable?如何将 MojoX::Redis 结果分配给变量?
【发布时间】:2011-02-25 20:36:27
【问题描述】:

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

在文档中使用“打印”

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

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

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

附言。确实,我真的不了解这部分的异步范式。

【问题讨论】:

    标签: perl asynchronous redis mojolicious


    【解决方案1】:

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

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

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

    【讨论】:

    • 在 mojolicious 中,我在收到数据之前得到渲染。有必要创建 IOloop,如下所示。
    【解决方案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 循环上,并且只在最后接收数据。

    【讨论】:

    • 您可能应该在上面添加$data_out 定义以使这个答案更清楚。这种方法有效地使 get 阻塞 - 它等到接收到数据然后停止循环。
    • 谢谢,修复 $data_out 定义。顺便说一句,我将使用 AnyEvent::Redis。至少对我来说,这似乎是更聪明和知名的解决方案。
    猜你喜欢
    • 2020-12-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多