[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创教程] Mojo::UserAgent 非阻塞请求 - 回调函数与闭包

本帖最后由 523066680 于 2021-4-23 00:47 编辑

Mojo::UserAgent 非阻塞请求 - 回调函数与闭包


      在 Mojo::UserAgent 官方示例中,有一段非阻塞请求的示例


          Non-blocking request
          $ua->get('mojolicious.org' => sub ($ua, $tx) { say $tx->result->dom->at('title')->text });
          Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

      提供回调函数对$ua, $tx做相应处理。运行出现错误提示
      > Mojo::Reactor::Poll: I/O watcher failed: Can't call method "result" on an undefined value
      当时懒得探索,就自己改成传统方式,局部变量接收默认回调参数 $ua, $tx

          $ua->get('mojolicious.org' => sub {my ($ua, $tx) = @_; say $tx->result->dom->at('title')->text });

      其实在 Mojolicious::Guides 中有相关介绍,只是之前忽视了,
      https://docs.mojolicious.org/Mojolicious/Guides

      >Signatures
      On Perl 5.20+ you can also use the `-signatures` flag with Mojo::Base to enable support for subroutine signatures. Signatures are used in all examples for clarity, even when `-signatures` is omitted for brevity.、

      在use Mojo 相关模块的时候加上 -signatures 就可以开启该特性了。

      拓展

          有时抓取的数据要分门别类地存储到指定的目录/文件,如何告诉这个回调函数不同的位置?闭包是一种传递额外参数的合适方案。
          以下代码根据 %list 中的城市名单,获取不同城市的物流数据并保存到相应JSON文件。

              my $wdir = "D:/blah";
              for my $city ( keys %list )
              {
                  my $name = sprintf "%s/%s.json", $wdir, gbk($city);
                  $query->{"toCountryId"} = $ct_code->{$city};  # 城市ID 更新到请求数据中
                  $res = $ua->post( $url, to_json( $query ), closure->( $name ) );
              }

              $loop->start unless $loop->is_running;

              sub closure ($file) {
                  return sub ($ua, $tx) {
                      printf "%s\n", $file;
                      write_file( $file, $tx->result->body );
                  }
              }

      其他参考

          https://perldoc.perl.org/perlsub#Signatures

              use feature 'signatures';
              no warnings 'experimental::signatures';

      Announcing Perl 7

          https://www.perl.com/article/announcing-perl-7/

返回列表