[3] [DFN[Promise.pm]] は、 [[Perl]] 用の [[promise]] の[[実装]]です。

[REFS[
- [2] [CITE@en[wakaba/perl-promise: Promise in Perl]] ([TIME[2017-07-03 12:11:40 +09:00]]) <https://github.com/wakaba/perl-promise>
]REFS]

* API

[4] 
[CODE[Promise.pm]] は [[ECMAScript]] で規定される [[JavaScript]] の
[[[CODE[Promise]] (JavaScript)]] を、 [[Perl]] で利用可能とするための最低限の変更を加えて[[移植]]したものです。

[5] 
[CODE[[[use]] Promise]] することで、
[CODE[Promise->new]],
[CODE[Promise->resolve]],
[CODE[Promise->reject]],
[CODE[Promies->all]],
[CODE[Promise->race]]
といった [[API]] が [[JavaScript]] 同様の形で使えるようになります。

[6] また [CODE[Promise]] [[オブジェクト]]には
[CODE[then]] や
[CODE[catch]] のような[[メソッド]]があります。

[7] 
加えて、 [[JavaScript]] の [CODE[Promise][Promise (JavaScript)]] 同様に、
[CODE[then]] [[メソッド]]を実装した任意の ([CODE[Promise.pm]] 以外の) [[オブジェクト]]を
[[promise]] として混在させることもできます。

-*-*-

[8] 
[[Perl]] 独自 [[API]] として、
[CODE[AnyEvent]] の [[CondVar]] との相互変換の[[メソッド]]があります。

[9] 
[CODE[[VAR[$promise]] = [[Promise][Promise.pm]]->[[from_cv]] ([VAR[$cv]])]] で、 [[CondVar]] から 
[CODE[recv]] した時に[[履行]]される[[約束]]を得ることができます。

[10] [CODE[[VAR[$cv]] = [VAR[$promise]]->[[to_cv]]]] で、
[[約束]]が[[履行]]された時にその値を [CODE[send]] する [[CondVar]] を得ることができます。

* AnyEvent との関係

[11] 
[CODE[Promise.pm]] 自体は [[API]] を提供するだけなので、別途[[イベントループ]]が必要です。
既定の状態では、 [[AnyEvent]] を使っています。

[12] 
そのため [CODE[Promise.pm]] を利用するには [CODE[[[use]] [[AnyEvent]]]] できる状態にしておくか、
別の[[イベントループ]]の [[Perlモジュール]]を使うように指定する必要があります。

* 応用

[13] [CODE[Promised]]

* メモ

[1] [CITE[Perl で Promise - Qiita ''''''[''''''キータ'''''']'''''']]
([TIME[2013-11-17 02:28:49 +09:00]] 版)
<https://qiita.com/wakaba@github/items/5f7ef32c0dd5172dfeed>
