Perl Mojolicious:将参数传递给代码引用

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")

Håk*_*and 5

现在我皈依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)