Promise in Perl

Saturday, Mar 15, 2025| Tags: Perl

DISCLAIMER: Image is generated using FREE version of ChatGPT.



Promise in Perl


Few days ago, I blogged about Future in Perl where I mentioned Future aka Promise.

In this post, I would replicate the behaviour using CPAN modules: Promise::ES6 and AE.

Since Perl believes in the philosophy of TMTOWTDI, so let’s implement the most basic pattern of Promiseas below:


fetch()
.then(process)
.then(save)
.then(display)
.catch(error);

#!/usr/bin/env perl

use v5.38;
use AE;
use Promise::ES6;

my $ae = AE::cv;

sub fetch {
    return Promise::ES6->new(sub {
        my ($resolve, $reject) = @_;

        my $delay = int(rand(2)) + 1;
        my $timer;
        $timer = AE::timer $delay, 0, sub {
            undef $timer;
            $resolve->("Fetch: data");
        };
    });
}

sub process($data) {
    return Promise::ES6->new(sub {
        my ($resolve, $reject) = @_;

        my $delay = int(rand(2)) + 1;
        my $timer;
        $timer = AE::timer $delay, 0, sub {
            undef $timer;
            $resolve->("Process: $data");
        };
    });
}

sub save($data) {
    return Promise::ES6->new(sub {
        my ($resolve, $reject) = @_;

        my $delay = int(rand(2)) + 1;
        my $timer;
        $timer = AE::timer $delay, 0, sub {
            undef $timer;
            $resolve->("Save: $data");
        };
    });
}

sub display($data) {
    say "Display: $data";
    $ae->send;
}

sub error($message) {
    say "Error: $message";
    $ae->send;
}

fetch()
    ->then( sub { return process(@_); })
    ->then( sub { return save(@_);    })
    ->then( sub { return display(@_); })
    ->catch(sub { return error(@_);   });

$ae->recv;

Output



$ perl promise.pl
Display: Save: Process: Fetch: data

Happy Hacking!!

SO WHAT DO YOU THINK ?

If you have any suggestions or ideas then please do share with us.

Contact with me