Захват как разрешенных, так и отклоненных в Mojo::Promises в Perl

#perl #mojo-useragent

#perl #mojo-useragent

Вопрос:

Я играю с 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;
  

Ответ №1:

Я думаю, что я бы упростил. Дайте каждому обещанию свои собственные обработчики, а затем просто соедините их все вместе. Внутри ссылок на код 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
  

У меня есть много других примеров Promises в веб-клиентах Mojo.