模块:莫霍::承诺
起源:Mojo::基础

名称

Mojo::Promise-Promises/A+

简介

使用Mojo::Promise;使用Mojo::UserAgent;#用promise包装延续传递风格的APImy$ua=Mojo::UserAgent->new;子get_p{my$promise=Mojo::promise->new;$ua->get(@_=>sub($ua,$tx){我的$err=$tx->错误;if(!$err||$err->{code}){$promise->resolve($tx)}否则{$promise->reject($err->{message})}});返回$promise;}#按顺序执行非阻塞操作获取_('https://mojolicious.org')->然后(sub($mojo){说$mojo->res->code;返回get_p('https://metapan.org');})->然后(sub($cpan){说$cpan->res->code;})->catch(子($err){警告“出现问题:$err”;})->等待;#同步非阻塞操作(全部)我的$mojo=get_p('https://mojolicious.org');my$cpan=获取p('https://metapan.org');Mojo::Promise->all($Mojo,$cpan)->then(sub($Mojo,$cpan){说$mojo->[0]->res->code;说$cpan->[0]->res->code;})->catch(子($err){警告“出现问题:$err”;})->等待;#同步非阻塞操作(竞争)my$mojo=get_p('https://mojolicious.org');my$cpan=获取p('https://metapan.org');Mojo::承诺->比赛($Mojo,$cpan)->然后(sub($tx){说$tx->req->url,“赢了!”;})->catch(子($err){警告“出现问题:$err”;})->等待;

描述

Mojo::承诺是的Perl-ish实现承诺/A+和的超集ES6承诺

承诺是表示非阻塞操作最终完成或失败的对象。它允许非阻塞函数返回值,如阻塞函数。但是,非阻塞函数并没有立即返回最终值,而是返回一个承诺,即在将来某个时候提供该值。

承诺可以是三种状态之一:

悬而未决的

初始状态,既不满足也不拒绝。

完成了

表示操作已成功完成。

拒绝

这意味着操作失败。

待定的承诺可以用价值实现,也可以用理由拒绝。无论发生哪种情况,关联的处理程序都会按承诺排队“然后”方法。

属性

Mojo::承诺实现以下属性。

奥洛普

我的$loop=$promise->ioloop;$promise=$promise->ioloop(Mojo::ioloop->new);

要控制的事件循环对象,默认为全局Mojo::IOLoop单身。请注意,该属性被削弱了。

方法

Mojo::承诺从继承所有方法Mojo::基础并实现了以下新功能。

全部的

my$new=Mojo::Promise->all(@promises);

返回一个新Mojo::承诺当所有传递的Mojo::承诺一旦其中一个对象拒绝,则该对象已完成或拒绝。如果返回的承诺实现了,那么它将按照与传递的承诺相同的顺序使用已实现承诺中的值来实现。

全部结算(_S)

my$new=Mojo::Promise->all_settled(@promises);

返回一个新Mojo::承诺当所有传递的Mojo::承诺对象已实现或拒绝,并使用哈希引用描述每个承诺的结果。

任何

my$new=Mojo::Promise->any(@promises);

返回一个新Mojo::承诺对象,只要其中一个Mojo::承诺对象实现了承诺的价值。

抓住

my$new=$promise->catch(sub{…});

将拒绝处理程序回调追加到promise,并返回一个新的Mojo::承诺对象解析为回调的返回值(如果调用),或者解析为其原始实现值(如果实现了承诺)。

#较长版本my$new=$promise->then(undef,sub{…});#传递拒绝原因$promise->catch(sub(@reason)){警告“出现问题:$reason[0]”;return@reason;});#更改拒绝原因$promise->catch(sub(@reason){“这不好:$reason[0]”});

克隆

我的$new=$promise->克隆;

返回新的Mojo::承诺从这个承诺中克隆出来的对象仍然悬而未决。

最后

my$new=$promise->finally(sub{…});

将履行和拒绝处理程序附加到承诺,并返回新的Mojo::承诺对象解析为原始实现值或拒绝原因。

#做一些满足和拒绝的事情$promise->finally(子{说“我们完成了!”});

地图

my$new=Mojo::Promise->map(sub{…},@items);my$new=Mojo::Promise->map({concurrency=>3},sub{…},@items);

应用返回Mojo::承诺添加到项目列表中的每个项目,同时可选地限制并发性。返回一个Mojo::承诺以与“全部”。如果任何项目的承诺被拒绝,则尚未映射的任何剩余项目将不会被拒绝。

#同时执行3个请求Mojo::Promise->map({concurrency=>3},sub{$ua->get_p($_)},@urls)->然后(子{say$_->[0]->res->dom->at('title')->text for@});

这些选项当前可用:

并发
并发性=>3

同时正在进行的最大项目数。

新的

my$promise=Mojo::promise->new;my$promise=Mojo::promise->new(sub{…});

构建新的Mojo::承诺对象。

#包装continuation-passing样式APImy$promise=Mojo::promise->new(sub($resolve,$reject){Mojo::IOLoop->计时器(5=>sub{if(int rand 2){$resolve->('幸运!')}else{$reject->(“不幸!”)}});});

比赛

my$new=Mojo::Promise->race(@promises);

返回新的Mojo::承诺对象,只要通过其中一个Mojo::承诺对象以承诺的价值或理由实现或拒绝。

拒绝

my$new=Mojo::Promise->reject(@reason);$promise=$promise->拒绝(@reason);

生成被拒绝Mojo::承诺以一个或多个拒绝理由反对或拒绝承诺。

#较长版本my$promise=Mojo::promise->new->reject(@reason);

决定

my$new=Mojo::Promise->resolve(@value);$promise=$promise->resolve(@value);

生成已解决Mojo::承诺用一个或多个实现值反对或解决承诺。

#较长版本my$promise=Mojo::promise->new->resolve(@value);

然后

my$new=$promise->然后(sub{…});my$new=$promise->then(sub{…},sub{…});my$new=$promise->then(undef,sub{…});

将履行和拒绝处理程序附加到承诺,并返回新的Mojo::承诺对象解析为被调用处理程序的返回值。

#传递实现值或拒绝原因$promise->那么(sub(@值){说“结果是$value[0]”;return@value;},sub(@原因){警告“出现问题:$reason[0]”;return@reason;});#更改履行值或拒绝原因$promise->那么(sub(@value){return“这很好:$value[0]”},sub(@reason){return“这不好:$reason[0]”});

计时器

my$new=Mojo::承诺->计时器(5=>“成功!”);$promise=$promise->计时器(5=>“成功!”);$promise=$promise->timer(5);

创建新的Mojo::承诺使用计时器对象或将计时器附加到现有承诺。承诺将在给定的时间(秒)后解决,无论是否有值。

超时

my$new=Mojo::Promise->timeout(5=>'timeout!');$promise=$promise->timeout(5=>“timeout!”);$promise=$promise->超时(5);

创建新的Mojo::承诺对象,或将超时附加到现有承诺。承诺将在给定的时间(秒)后被拒绝,原因默认为承诺超时

等待

$promise->wait;

起点“ioloop”一旦承诺实现或被拒绝,就再次停止,在以下情况下什么也不做“ioloop”已在运行。

调试

您可以设置MOJO_PROMISE_DEBUG公司将一些高级诊断信息打印到的环境变量STDERR公司

MOJO_PROMISE_DEBUG=1

另请参阅

Mojolicious公司,Mojolicuis::指南,https://mojolicious.org