Size: a a a

2020 December 16

W

Warstone in Modern::Perl
allter
Он и не будет дожидаться. Колбэк в then выполнится (асинхронно), когда заресолвится промис, на который он навешен.
Например, если произойдёт ошибка получения на любом шаге, он вообще не вызовется, (а get() заресолвится в ошибку).
Под дожидаться - я имел ввиду асинхронно, конечно.
источник

b

basiliscos in Modern::Perl
Warstone
Я-же не могу сделать $get_chunk->{"http://127.0.0.1")->then(sub { my ($list) = @_; ... })
почему не можешь? Можешь. Фича промисов: фактичеки ты создаёшь чейн выполнения, и отдаёшь его вызывающему. А уже вызывающий либо крутит, либо навешивает свою логику then/else/always и отдаёшь выше опять.
источник

W

Warstone in Modern::Perl
Там list небыл отдан.
источник

W

Warstone in Modern::Perl
Но это придирка, на самом деле.
источник

b

basiliscos in Modern::Perl
Warstone
Да, за чет того что then, в случае если ему вернули промис, будет его дожидаться... Но это вроде не так давно появилось или я путаю?
Всегда такое было в апи Future
источник

ПК

Павел Колганов ☭... in Modern::Perl
У Ярослава вновь проблемы с этой группой.
Он передал спасибо! Такой вариант проверку проходит.
источник

b

basiliscos in Modern::Perl
Warstone
Тоже довольно лаконично, как по мне, но нету явного цикла. Поэтому он хуже чем a/a версия. Читабельности нету.
ща покажу тебе как с циклом будет
источник

SZ

Sergey Zhmylove in Modern::Perl
Павел Колганов ☭
У Ярослава вновь проблемы с этой группой.
Он передал спасибо! Такой вариант проверку проходит.
Значит тот модуль для перлкритик всё же дурачки написали...
источник

b

basiliscos in Modern::Perl
Warstone
Тоже довольно лаконично, как по мне, но нету явного цикла. Поэтому он хуже чем a/a версия. Читабельности нету.
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

Vadim Goncharov in Modern::Perl
Warstone
А вот код на коллбеках, кстати:
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

Warstone in Modern::Perl
Там нету рекурсии.
источник

W

Warstone in Modern::Perl
Это асинк, HTTP::Request вернется моментально. Запрос будет выполнен потом в лупе.
источник

VG

Vadim Goncharov in Modern::Perl
Павел Колганов ☭
У Ярослава вновь проблемы с этой группой.
Он передал спасибо! Такой вариант проверку проходит.
тогда ему остается только в https://t.me/usePerlOrDie
источник

VG

Vadim Goncharov in Modern::Perl
Warstone
Это асинк, HTTP::Request вернется моментально. Запрос будет выполнен потом в лупе.
я открыл perldoc HTTP::Request и ничего там такого не увидел
источник

W

Warstone in Modern::Perl
Потому что ты, как всегда, читаешь по диагонали. Прочти внимательно. Этот чат, а не доку.
источник

VG

Vadim Goncharov in Modern::Perl
Warstone
Потому что ты, как всегда, читаешь по диагонали. Прочти внимательно. Этот чат, а не доку.
воображаемый модуль, интегрированный с лупом, что ли?
источник

W

Warstone in Modern::Perl
Поздравляю.
источник

b

basiliscos in Modern::Perl
Warstone
А вот код на коллбеках, кстати:
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 передаётся во внуть ф-ции. В промисах - это вовне. Поэтому, как по мне, промисы удобней. Но по сути, да, согласен, что они эквивалентны. Т.е.


get_all(100_500, sub {
   my $ok =  shift;
   ...
})

vs

get_all(100_500)
  ->then(
       sub { } # succes branch
       sub { } # fail branch
  )
 
или
get_all(100_500)
  ->then(sub { ... })
  ->else(sub { ... })
```
источник

VG

Vadim Goncharov in Modern::Perl
теперь вопрос, какой луп реально позволяет так интегрироваться
источник

W

Warstone in Modern::Perl
Так - как?
источник