a
Для того, что бы добиться идеальной композабельности, надо как раз перейти на полностью функциональные алгоритмы и структуры данных. Т.е. от промисов к Task/IO, а от них - к функциональным стримам.
Size: a a a
a
W
W
W
W
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
a
sub get: Async {
my $list = [];
my $data = await HTTP::Request->request("http://127.0.0.1");
push(@$list, @{$data->json->{data}});
while(my $page = $data->json->{next}) {
$data = await HTTP::Request->request("http://127.0.0.1?page=$page");
push(@$list, @{$data->json->{data}});
}
return $list;
}
my $list = [];
my $get_chunk;
$get_chunk = sub { my $url = shift;
HTTP::Request->request($url)->then( sub { my $data = shift;
push(@$list, @{$data->json->{data}});
if ( my $page = $data->json->{next} ) {
$get_chunk->( "http://127.0.0.1?page=$page" );
} else {
undef;
}
} );
};
my $promise = $get_chunk->( "http://127.0.0.1" );W
W
a
W
W
a
$promise->then( sub { return $list; } );
вызовется только когда $page больше не будет
a
a
AK
var request = construct_my_request();
List<result> results = new List<result>();
var request_results;
int page_num = 0;
do {
request_results = await request.Invoke(page_num++);
results.Add(request_results);
} while(request_results.Count == PAGE_LIMIT);
W
$promise->then( sub { return $list; } );
вызовется только когда $page больше не будет
IB
W
a