You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:02:31