在一个Mojolicious控制器中,我想链接两组Promise。第一组(例如delDB1
和delDB2
)从源中删除,完成后,第二组(例如addBD1
和addDB2
)添加到源中。
你会添加另一个then
吗?如果是,我如何传递新的Promises集?
将调用嵌套在内部似乎不正确。
my @promise;
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 @promise, $prom;
}
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
Mojo::Promise->all(@promise)
->then(
sub {
my ($delDB1response, $delDB2response) = map {$_->[0]} @_;
### Nest a call for another set of promises?
$app->render(openapi=>{messages=>"success"});
})->catch(
sub ($err) {
warn "### Something went wrong: $err";
})->wait;
1条答案
按热度按时间i7uq4tfw1#
你的问题不清楚。我认为你想要以下内容:
1.试试
1.启动
delDB1
。1.启动
delDB2
。1.等待两者完成。
1.启动
addDB1
。1.启动
addDB2
。1.等待两者完成。
1.呈现成功的响应。
1.接住
1.呈现失败响应。
这可以通过以下方式实现:
在上面的例子中,
_async
函数应该返回一个promise。如果我们为了讨论而给予promise命名,代码就变成了
关键部分是当
$promise7
满足时,$promise4
也满足,并且具有相同的值。但假设你想
1.试试
1.开始时间:
1.启动
delDB1
。1.等待它完成。
1.启动
addDB1
。1.等待它完成。
1.开始时间:
1.启动
delDB2
。1.等待它完成。
1.启动
addDB2
。1.等待它完成。
1.等待两者完成。
1.呈现成功的响应。
1.接住
1.呈现失败响应。
这可以通过以下方式实现:
示例
delDB1_async
:给
->new
传递一个sub会更好,因为该代码的异常会导致promise被拒绝。如果代码意外抛出异常,这是很好的。...除了Mojo::Promise违反了它声称遵守的规范。所以如果代码意外抛出异常,你现在就完蛋了。