#!perl
use
Promises
'deferred'
,
backend
=> [
'EV'
];
my
@out
;
my
$cv
= AE::cv;
is( exception {
a_promise()
->then(
sub
{
"1: OK"
} )
->then(
sub
{
push
@out
,
@_
;
die
"2: OK\n"
} )
->then(
sub
{
push
@out
,
"2: Not OK"
},
sub
{
push
@out
,
@_
;
"3: OK"
}
)
->then(
sub
{
push
@out
,
@_
;
die
"4: OK\n"
},
sub
{
push
@out
,
@_
,
"3: Not OK"
}
)
->then(
sub
{
push
@out
,
"4: Not OK"
},
sub
{
push
@out
,
@_
;
die
"5: OK\n"
}
)
->done(
sub
{
push
@out
,
"4: Not OK"
},
sub
{
push
@out
,
@_
;
die
"Final\n"
}
);
my
$w
= AE::timer( 1, 0,
sub
{
$cv
->
send
} );
$cv
->
recv
;
},
undef
,
"Exception in EV done is swallowed"
);
is
$out
[0],
'1: OK'
,
"Resolve"
;
is
$out
[1],
"2: OK\n"
,
"Resolve then die"
;
is
$out
[2],
'3: OK'
,
"Reject then resolve"
;
is
$out
[3],
"4: OK\n"
,
"Resolve then die"
;
is
$out
[4],
"5: OK\n"
,
"Reject then die"
;
sub
a_promise {
my
$d
= deferred;
my
$w
;
$w
= AnyEvent->timer(
after
=> 0,
cb
=>
sub
{
$d
->resolve(
'OK'
);
undef
$w
;
}
);
$d
->promise;
}
done_testing;