#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.