在Mojo::IOLoop::Subprocess中使用IPC::Run

问题描述 投票:0回答:1

我有这个 perl 包:

package Mojo::Runner;

use Mojo::Base 'Mojo::EventEmitter';

use Mojo::IOLoop::Subprocess;
use Mojo::Promise;
use IPC::Run;

sub run_p {
    my ($self, $command, $stdin) = @_;
    my ($stdout, $stderr);

    my $subprocess = Mojo::IOLoop::Subprocess->new;

    return $subprocess->run_p(sub {
               my ($stdin, $stdout, $stderr);
               my $process = IPC::Run::run $command, \$stdin, \$stdout, \$stderr;

               my $e = $?;

               my $promise = Mojo::Promise->new;
               return $promise->reject($stderr)  if $e;
               return $stdout
               })
}

1

应该使用 IPC::Run 从 Mojo::IOLoop::Subprocess 中运行一些进程,以便我可以按如下方式使用它:

use FindBin qw($Bin);
use lib "$Bin/./lib";
use Mojo::Runner;
use strict;

$\ = "\n"; $, = "\t";

my $r = Mojo::Runner->new;

my $subprocess = $r->run_p(["rclone", "lsl", "my_own:", sprintf "--drive-root-folder-id=%s", "some_id" ])
    ->then(sub {
           print $_ =~ s/\n$//msr for @_
       })
    ->catch(sub  {
        my $err = shift;
        print "Subprocess error: $err";
        });

$subprocess->ioloop->start unless $subprocess->ioloop->is_running;

现在,当我故意失败时,例如使用错误的命令语法,我会收到错误:

Unhandled rejected promise: 2024/10/01 17:25:57 Failed to lsl: couldn't list directory: googleapi: Error 404: File not found: ., notFound
 at /Users/simone/perl5/perlbrew/perls/perl-5.36.0/lib/site_perl/5.36.0/Mojo/IOLoop/Subprocess.pm line 55.

如果 IPC::Run 进程返回正常,则一切正常。

为什么未处理的承诺?我需要改变什么?

perl promise mojolicious
1个回答
0
投票

“未处理的被拒绝的承诺”是您创建的承诺

return $promise->reject($stderr)  if $e;

错误消息是在执行代码中的

then()
处理程序之前发出的。

您只需将其更改为

die $stderr if $e;

并且您的代码应该按照您的预期运行。

认为发生的情况是,您在子进程中创建了被拒绝的 Promise,但是在子进程中执行的代码中没有用于被拒绝的 Promise 的处理程序,并且您无法通过 JSON 序列化将被拒绝的 Promise 从子进程传输到子进程父级(您的捕获处理程序所在的位置)。

© www.soinside.com 2019 - 2024. All rights reserved.