- 帖子
- 3151
- 积分
- 6455
- 技术
- 317
- 捐助
- 70
- 注册时间
- 2008-8-3
|
[原创教程] 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/
|
|