免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1697 | 回复: 0
打印 上一主题 下一主题

Mojo::UserAgent为啥存在作用域问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-16 17:33 |只看该作者 |倒序浏览
无意在google groups看到的帖子,提到了mojo::useragent的作用域问题,十分惊讶,实验以下代码,发现delay的第二个匿名子过程的get,都没有正确执行!
  1. use 5.10.0;
  2. #!/usr/bin/env perl

  3. use strict;
  4. use warnings;

  5. use feature 'say';

  6. use Mojolicious::Lite;
  7. use Mojo::UserAgent;
  8. use Mojo::IOLoop;
  9. use Mojo::URL;

  10. get '/test' => sub {
  11.    my $self = shift;

  12.    my @data;

  13.    my $url = Mojo::URL->new('http://www.baidu.com/s');
  14.    [color=Red]my $ua  = Mojo::UserAgent->new;[/color]
  15.    my $result = [];
  16.    Mojo::IOLoop->delay(

  17.       sub {
  18.          my $delay = shift;
  19.          print "1st step!\n";
  20.          $ua->get($url->clone->query({wd => 'mojo'}) => $delay->begin);
  21.       },

  22.       sub {
  23.          my ($delay, @res) = @_;
  24.          print "2nd step! with args: @{[ scalar @res ]}\n";
  25.          foreach my $tx (@res) {
  26.             if ($tx->success) {
  27.                 my $url = $tx->req->url->to_string;
  28.                 push @$result, "get $url success!\n";
  29.             }
  30.          }

  31.          $ua->get($url->clone->query({wd => 'perl'}) => $delay->begin);
  32.       },

  33.       sub {
  34.          my ($delay, @res) = @_;
  35.          print "3rd step! with args: @{[ scalar @res ]}\n";
  36.          foreach my $tx (@res) {
  37.             if ($tx->success) {
  38.                 my $url = $tx->req->url->to_string;
  39.                 push @$result, "get $url success!\n";
  40.             }
  41.          }
  42.          $self->render_text("all jobs done!\n@$result");
  43.       }
  44.    );

  45. };

  46. app->start;
复制代码
帖子也给出了解决方案,十分简单,将上面红色的代码,修改为:
  1. state $ua  = Mojo::UserAgent->new;
复制代码
代码上看$ua,作为closure context的变量,下面所有的匿名子过程,都应该能偶正确访问。而且这些匿名子过程也没有去修改$ua,那么为什么第二个匿名子过程,不能正确访问my声明的$ua呢?

增加了mojo的debug开关,看了下,第二个匿名子过程,如果访问的是my $ua,则只有request发送,之后get的callback不会执行!由此证明,第二个匿名sub,还是能访问$ua的,那为啥callback被忽略了?更迷惑了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP