<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <dfn>Promise.pm</dfn> は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> 用の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">promise</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実装</anchor>です。</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite xml:lang="en">wakaba/perl-promise: Promise in Perl</cite> (<time>2017-07-03 12:11:40 +09:00</time>) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/wakaba/perl-promise">https://github.com/wakaba/perl-promise</anchor-external></li></ul></refs><section><h1>API</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> 
<code>Promise.pm</code> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ECMAScript</anchor> で規定される <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JavaScript</anchor> の
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">Promise</code> (JavaScript)</anchor> を、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> で利用可能とするための最低限の変更を加えて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">移植</anchor>したものです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> 
<code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">use</anchor> Promise</code> することで、
<code>Promise-&gt;new</code>,
<code>Promise-&gt;resolve</code>,
<code>Promise-&gt;reject</code>,
<code>Promies-&gt;all</code>,
<code>Promise-&gt;race</code>
といった <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JavaScript</anchor> 同様の形で使えるようになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> また <code>Promise</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">オブジェクト</anchor>には
<code>then</code> や
<code>catch</code> のような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> 
加えて、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JavaScript</anchor> の <code>Promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Promise (JavaScript)</title></code> 同様に、
<code>then</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>を実装した任意の (<code>Promise.pm</code> 以外の) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">オブジェクト</anchor>を
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">promise</anchor> として混在させることもできます。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> 独自 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> として、
<code>AnyEvent</code> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CondVar</anchor> との相互変換の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> 
<code><var>$promise</var> = <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Promise.pm</title></anchor>-&gt;<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">from_cv</anchor> (<var>$cv</var>)</code> で、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CondVar</anchor> から 
<code>recv</code> した時に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">履行</anchor>される<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">約束</anchor>を得ることができます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <code><var>$cv</var> = <var>$promise</var>-&gt;<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to_cv</anchor></code> で、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">約束</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">履行</anchor>された時にその値を <code>send</code> する <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CondVar</anchor> を得ることができます。</p></section><section><h1>AnyEvent との関係</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> 
<code>Promise.pm</code> 自体は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> を提供するだけなので、別途<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベントループ</anchor>が必要です。
既定の状態では、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">AnyEvent</anchor> を使っています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> 
そのため <code>Promise.pm</code> を利用するには <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">use</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">AnyEvent</anchor></code> できる状態にしておくか、
別の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベントループ</anchor>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perlモジュール</anchor>を使うように指定する必要があります。</p></section><section><h1>応用</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> <code>Promised</code></p></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <cite>Perl で Promise - Qiita <strong></strong>[<strong></strong>キータ<strong></strong>]<strong></strong></cite>
(<time>2013-11-17 02:28:49 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://qiita.com/wakaba@github/items/5f7ef32c0dd5172dfeed">https://qiita.com/wakaba@github/items/5f7ef32c0dd5172dfeed</anchor-external></p></section></body></html>