我有这个 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 进程返回正常,则一切正常。
为什么未处理的承诺?我需要改变什么?
“未处理的被拒绝的承诺”是您创建的承诺
return $promise->reject($stderr) if $e;
错误消息是在执行代码中的
then()
处理程序之前发出的。
您只需将其更改为
die $stderr if $e;
并且您的代码应该按照您的预期运行。
我认为发生的情况是,您在子进程中创建了被拒绝的 Promise,但是在子进程中执行的代码中没有用于被拒绝的 Promise 的处理程序,并且您无法通过 JSON 序列化将被拒绝的 Promise 从子进程传输到子进程父级(您的捕获处理程序所在的位置)。