W
Например, если произойдёт ошибка получения на любом шаге, он вообще не вызовется, (а get() заресолвится в ошибку).
Size: a a a
W
b
W
W
b
ПК
b
SZ
b
my get_all_or_1st_err {
my $count = shift;
my @fututes;
for my $i (1 .. $count) {
my $f = Future->new(...);
AE::get::http "/" => sub {
my ($result, $err) = @_;
return $f->done($result) if $err;
$f->fail($err);
}
push @futures, $f;
}
# композиция
return Future->needs_any(\@futures);
}
...
# ветвление после композиции
my $f = get_all_or_1st_err(100_500)
->then(sub {
my $results = shift->get;
})
->else(sub { die shift })
;
# крутим луп
$f->await;
VG
sub get {
my ($on_complete) = @_;
my $list = [];
HTTP::Request->request("http://127.0.0.1", my $chunk_work = sub {
my ($result) = @_;
push(@$list, @{$result->json->{data}});
if(my $page = $result->json->{next}) {
HTTP::Request->request("http://127.0.0.1?page=$page", $chunk_work);
} else {
$on_complete->($list);
}
});
}
W
W
VG
VG
W
VG
W
b
sub get {
my ($on_complete) = @_;
my $list = [];
HTTP::Request->request("http://127.0.0.1", my $chunk_work = sub {
my ($result) = @_;
push(@$list, @{$result->json->{data}});
if(my $page = $result->json->{next}) {
HTTP::Request->request("http://127.0.0.1?page=$page", $chunk_work);
} else {
$on_complete->($list);
}
});
}
on_complete
передаётся во внуть ф-ции. В промисах - это вовне. Поэтому, как по мне, промисы удобней. Но по сути, да, согласен, что они эквивалентны. Т.е.VG
W