Mojolicious控制器中如何正确链式调用两组Promise(先删后加)
Mojolicious中链式调用两组Promise的正确方式
核心方案
确实需要添加另一个then来实现两组Promise的顺序执行,而且完全不需要嵌套调用——只要在第一个then的回调中创建第二组添加操作的Promise集合,然后返回Mojo::Promise->all(@add_promises),Promise链会自动等待这组操作全部完成后,再进入后续的then或catch处理。
修改后的完整代码示例
# 第一组:删除操作的Promise集合 my @del_promises; foreach my $code (\&delDB1, \&delDB2) { my $prom = Mojo::Promise->new; Mojo::IOLoop->subprocess( sub { return $code->($number); }, sub { my ($subprocess, $err, @res) = @_; return $prom->reject($err) if $err; $prom->resolve(@res); }, ); push @del_promises, $prom; } # 链式执行:先删后加 Mojo::Promise->all(@del_promises) ->then(sub { my ($delDB1response, $delDB2response) = map { $_->[0] } @_; # 可在此处理删除操作的返回结果 # 创建第二组:添加操作的Promise集合 my @add_promises; foreach my $code (\&addDB1, \&addDB2) { my $prom = Mojo::Promise->new; Mojo::IOLoop->subprocess( sub { return $code->($number); # 根据实际需求传入参数 }, sub { my ($subprocess, $err, @res) = @_; return $prom->reject($err) if $err; $prom->resolve(@res); }, ); push @add_promises, $prom; } # 返回添加操作的Promise集合,让链自动等待其完成 return Mojo::Promise->all(@add_promises); }) ->then(sub { my ($addDB1response, $addDB2response) = map { $_->[0] } @_; # 所有操作完成后渲染成功响应 $app->render(openapi => { messages => "success" }); }) ->catch(sub ($err) { warn "### Something went wrong: $err"; # 出错时渲染错误响应 $app->render(openapi => { error => $err }, status => 500); }) ->wait; Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
关键说明
- 第一个
then的回调返回Mojo::Promise->all(@add_promises)后,Promise链会暂停,直到所有添加操作的Promise都完成(或某一个失败)。 - 后续的
then会接收添加操作的返回结果,此时再执行响应渲染,确保所有操作都完成后才返回给客户端。 - 整个流程是线性链式结构,没有嵌套,代码逻辑清晰,
catch会捕获两组操作中任意一处的错误。
内容的提问来源于stack exchange,提问作者h q
相关产品推荐
相关产品推荐

