h q*_*h q 2 syntax perl coderef promise mojolicious
在我的 Mojolicious 控制器中,我有:
my @promise;
foreach my $code (\&doit1, \&doit2,) {
my $prom = Mojo::Promise->new;
Mojo::IOLoop->subprocess(
sub {
my $r = $code->("Hello");
return $r;
},
sub {
my ($subprocess, $err, @res) = @_;
return $prom->reject($err) if $err;
$prom->resolve(@res);
},
);
push @promise, $prom;
}
Mojo::Promise
->all(@promise)
->then(
sub {
my ($result1, $result2) = map {$_->[0]} @_;
});
Run Code Online (Sandbox Code Playgroud)
这有效,我可以将参数(例如Hello)传递给我的子程序。
现在我皈依doti1()并doit2()成为帮手。所以代码看起来像:
foreach my $code (sub {$self->myhelper->doit1("Goodbye")},
sub {$self->myhelper->doit2("Good night")},
) {
my $prom = Mojo::Promise->new;
Mojo::IOLoop->subprocess(
sub {
my $r = $code->("Hello"); # this is ignored?
return $r;
},
sub {
my ($subprocess, $err, @res) = @_;
return $prom->reject($err) if $err;
$prom->resolve(@res);
},
);
push @promise, $prom;
}
Run Code Online (Sandbox Code Playgroud)
如何继续在循环内传递相同的参数集(例如Hello),而不必在每个代码引用中指定它们(即避免Goodbye& Good night)?我喜欢为每个代码引用传递相同参数的想法:$code->("Hello")
现在我皈依
doti1()并doit2()成为帮手。所以代码看起来像:
foreach my $code (sub {$self->myhelper->doit1("Goodbye")},
sub {$self->myhelper->doit2("Good night")},
) {
#....
}
Run Code Online (Sandbox Code Playgroud)
是的,但你正在从另一个匿名潜艇中呼叫帮助者,
如何继续在循环内传递相同的参数集(例如 Hello),而不必在每个代码引用中指定它们
因此,要恢复参数并将其传递给助手,您只需执行以下操作:
foreach my $code (sub {my $arg = shift; $self->myhelper->doit1($arg)},
sub {my $arg = shift; $self->myhelper->doit2($arg)},
) {...}
Run Code Online (Sandbox Code Playgroud)
或者更一般地说,正如 @Dada 在评论中指出的那样:
foreach my $code (sub {$self->myhelper->doit1(@_)},
sub {$self->myhelper->doit2(@_)},
) {...}
Run Code Online (Sandbox Code Playgroud)