1

我正在使用 Mojo::UserAgent 和 Mojo::Promise 运行对 3 个服务 A、B 和 C 的非阻塞调用。问题是当所有服务连接/解析时它工作正常,但如果其中之一,比如说,服务 C 无法连接,整个事情都失败了。有没有办法捕获所有服务(连接和不连接)?非常感谢任何见解。谢谢!

 my @urls = (   
   'https://hostA/serviceA',  # ServcieA connects and returns some text
   'https://hostB/serviceB',  # ServiceB connects and returns some text
   'https://hostC/serviceC',  # ServiceC refuses to connect 
 ); 
 my $ua = Mojo::UserAgent->new; 
 my @promises = map { $ua->get_p($_) } @urls;
 Mojo::Promise->all( @promises )->then(   
   sub {
     for my $tx (map { $_->[0] } @_) {
       print "Service result: $tx->res->text";
     }#end for   
   }#end sub 
 )->catch(   
   sub {
     for my $err (map { $_->[0] } @_) {
       print "ERROR: $err";
     }#end for   
   }#end sub 
 )->wait;
4

1 回答 1

2

我想我会让它更简单。给每个 Promise 自己的处理程序,然后简单地将所有这些放在一起。在代码引用中then,做任何你需要做的事情:

#!perl
use v5.10;

use Mojo::Promise;
use Mojo::UserAgent;

my @urls = qw(
    https://www.yahoo.com
    https://hostB/serviceB
    https://hostC/serviceC
    );

 my $ua = Mojo::UserAgent->new;

 my @promises = map {
    my $url = $_;
    $ua->get_p( $url )->then(
        sub { say "$url connected" },
        sub { say "$url failed" },
        );
    } @urls;


 Mojo::Promise->all( @promises )->wait;

这输出连接或失败,尽管我也可以在某些数据结构或数据库中标记它们的状态:

https://hostB/serviceB failed
https://hostC/serviceC failed
https://www.yahoo.com connected

我在Mojo Web Clients中有许多其他 Promises 示例。

于 2020-10-29T20:42:40.203 回答