Future::Qをリリース
PerlのFutureモジュールのサブクラスとして、Future::Qというのを作ってみた。
これはFutureモジュールにthen()メソッドといったQ.jsと(ほぼ)互換のメソッドを付け加えたもの。
こんな感じで使う。
use Future::Q; sub async_func_future { my @args = @_; my $f = Future::Q->new; other_async_func( ## This is a regular callback-style async function args => \@args, on_success => sub { $f->fulfill(@_) }, on_failure => sub { $f->reject(@_) }, ); return $f; } async_func_future()->then(sub { my @results = @_; my @processed_values = do_some_processing(@results); return @processed_values; })->then(sub { my @values = @_; ## same values as @processed_values return async_func_future(@values); })->then(sub { warn "Operation finished.\n"; })->catch(sub { ## failure handler my $error = shift; warn "Error: $error\n"; });
then(), catch(), try()メソッドをつけているので、最低限「Qっぽい書き方」はできると思う。
オリジナルのFutureも含め、コールバックチェーンを作れるFuture/Promise/Deferred実装のCPANモジュールは他にもあるけど、どれも微妙にQ.jsと違うんだよな。