@debonet/es6pledges
Version:
Cancellable Promises for Javascript ES6
316 lines (250 loc) • 7.67 kB
JavaScript
const Pledge = require( "../src/es6pledges.js" );
function fpPledgeDelay( dtm ){
let timeout;
return new Pledge(
( fResolve, fReject ) => {
timeout = setTimeout(
() => { fResolve( "finishedPledge" )},
dtm
);
},
() => {
clearTimeout(timeout);
}
);
}
function fpPledgeDelayWithDelayedCancel( dtm, sCancel ){
let timeout;
return new Pledge(
( fResolve, fReject ) => {
timeout = setTimeout(
() => { fResolve( "finishedPledge" )},
dtm
);
},
( fResolve, fReject, b, x ) => {
return new Promise(( fOk ) => {
setTimeout(()=>{
clearTimeout(timeout);
fResolve( sCancel + x );
fOk();
}, 200 );
})
}
);
}
function fpPromiseDelay( dtm ){
return new Promise(
( fResolve, fReject ) => {
setTimeout(
() => { fReject( "finishedPromise" )},
dtm
);
}
);
}
// --------------------------------------------
test( "simple resolve", async () => {
const p1 = fpPledgeDelay( 10000 );
p1.resolve("faster");
const s = await p1;
expect( s ).toBe( "faster" );
});
// --------------------------------------------
test( "simple resolve", async () => {
const p1 = fpPledgeDelay( 10000 );
p1.reject( "faster" );
let s;
try {
s = await p1;
}
catch( err ){
s = err;
}
expect( s ).toBe( "faster" );
});
// --------------------------------------------
test( "simple then release", async () => {
const p1 = fpPledgeDelay( 10000 );
p1.resolve("faster");
const s = await p1.then( x => "resolved1" + x );
expect( s ).toBe( "resolved1faster" );
});
// --------------------------------------------
test( "simple catch reject", async () => {
const p1 = fpPledgeDelay( 10000 )
.catch( x => "first catch runs "+ x );
p1.reject("faster");
const p2 = p1.catch( x => "later catch does not run " + x );
const s = await p2;
expect( s ).toBe( "first catch runs faster" );
});
// --------------------------------------------
test( "then chains all release", async () => {
const p1 = fpPledgeDelay( 10000 )
.then( x => "first then, " + x );
p1.resolve("faster");
const s = await p1.then( x => "second then, " + x );
expect( s ).toBe( "second then, first then, faster" );
});
// --------------------------------------------
test( "simple then/catch reject", async () => {
const p1 = fpPledgeDelay( 10000 )
.then( x => "resolved1"+ x )
.catch( x => "first catch runs "+ x );
p1.reject("faster");
const p2 = p1.catch( x => "later catch does not run " + x );
const s = await p2;
expect( s ).toBe( "first catch runs faster" );
});
// --------------------------------------------
test( "all resolve", async () => {
const p1 = fpPledgeDelay( 10000 );
const p2 = fpPledgeDelay( 10000 );
const pBatch = Pledge.all([ p1, p2 ])
.then( x => { return { resolvedBatch : x }})
.catch( x => { return { rejectedBatch : x }})
pBatch.resolve("faster");
const s = await pBatch;
expect( s ).toStrictEqual({ resolvedBatch : [ "faster" , "faster" ]});
});
// --------------------------------------------
test( "all reject", async () => {
const p1 = fpPledgeDelay( 10000 );
const p2 = fpPledgeDelay( 10000 );
const pBatch = Pledge.all([ p1, p2 ])
.then( x => { return { resolvedBatch : x }})
.catch( x => { return { rejectedBatch : x }})
pBatch.reject("faster");
const s = await pBatch.catch( x => x );
expect( s ).toStrictEqual({ rejectedBatch : "faster" });
});
// --------------------------------------------
test( "any resolve", async () => {
const p1 = fpPledgeDelay( 10000 );
const p2 = fpPledgeDelay( 10000 );
const pBatch = Pledge.any([ p1, p2 ])
.then( x => { return { resolvedBatch : x }})
.catch( x => { return { rejectedBatch : x }})
p1.resolve("faster");
const s = await pBatch;
expect( s ).toStrictEqual({ resolvedBatch : "faster" });
});
// --------------------------------------------
test( "any but all rejected", async () => {
const p1 = fpPledgeDelay( 10000 );
const p2 = fpPledgeDelay( 10000 );
const pBatch = Pledge.any([ p1, p2 ])
.then( x => "resolvedBatch:"+ x )
.catch( x => "rejectedBatch:"+ x );
p2.reject("faster");
p1.reject("faster");
const s = await pBatch;
expect( s ).toBe( "rejectedBatch:AggregateError: All promises were rejected" );
});
// --------------------------------------------
test( "race resolve", async () => {
const p1 = fpPledgeDelay( 10000 );
const p2 = fpPledgeDelay( 10000 );
const pBatch = Pledge.race([ p1, p2 ])
.then( x => { return { resolvedBatch : x }})
.catch( x => { return { rejectedBatch : x }})
pBatch.resolve("faster");
const s = await pBatch;
expect( s ).toStrictEqual({ resolvedBatch : "faster" });
});
// --------------------------------------------
test( "race reject", async () => {
const p1 = fpPledgeDelay( 10000 );
const p2 = fpPledgeDelay( 10000 );
const pBatch = Pledge.race([ p1, p2 ])
.then( x => { return { resolvedBatch : x }})
.catch( x => { return { rejectedBatch : x }})
pBatch.reject("faster");
const s = await pBatch;
expect( s ).toStrictEqual({ rejectedBatch : "faster" });
});
// --------------------------------------------
test( "allSettled resolve", async () => {
const p1 = fpPledgeDelay( 10000 );
const p2 = fpPledgeDelay( 10000 );
const pBatch = Pledge.allSettled([ p1, p2 ]);
pBatch.resolve("faster");
const x = await pBatch;
expect( x ).toStrictEqual([
{
"status": "released-fulfilled",
"value": "faster",
},
{
"status": "released-fulfilled",
"value": "faster",
}
]);
});
// --------------------------------------------
test( "allSettled reject", async () => {
const p1 = fpPledgeDelay( 10000 );
const p2 = fpPledgeDelay( 10000 );
const pBatch = Pledge.allSettled([ p1, p2 ])
pBatch.reject("faster");
const x = await pBatch;
expect( x ).toStrictEqual([
{
"status": "released-rejected",
"reason": "faster",
},
{
"status": "released-rejected",
"reason": "faster",
}
]);
});
// --------------------------------------------
test( "allSettled resolve/reject", async () => {
const p1 = fpPledgeDelay( 10000 );
const p2 = fpPledgeDelay( 10000 );
const pBatch = Pledge.allSettled([ p1, p2 ])
p1.reject("faster");
p2.resolve("faster");
const x = await pBatch;
expect( x ).toStrictEqual([
{
"status": "rejected",
"reason": "faster",
},
{
"status": "fulfilled",
"value": "faster",
}
]);
});
// --------------------------------------------
test( "delayed cancel resolve", async () => {
const p1 = fpPledgeDelayWithDelayedCancel( 10000, "delayed" );
p1.resolve("faster");
const s = await p1;
expect( s ).toBe( "delayedfaster" );
});
/*
const p1 = fpPledgeDelay( 10000 )
.then( x => { console.log( "resolved1", x ); return x; })
.catch( x => { console.log("rejected1", x ); return Pledge.reject( x ); });
p1.resolve("ok").then( x => console.log("RESOLVE", x));
const p1 = fpPledgeDelay( 1000 )
.then( x => { console.log( "resolved1", x ); return x; })
.catch( x => { console.log("rejected1", x ); return Pledge.reject( x ); });
const p2 = fpPromiseDelay( 2000 )
.then( x => { console.log( "resolved2", x ); return x; })
.catch( x => { console.log("rejected2", x ); return Pledge.reject( x ); });
const pAllSettled = Pledge.allSettled([ p1, p2 ])
.then(( x )=>console.log("allSettled resolved", x))
.catch(( x )=>console.log("allSettled rejected", x));
pAllSettled.release( true, "releaseAllSettled" );
const pAny = Pledge.any([ p1, p2 ])
.then(( x )=>console.log("any resolved", x))
.catch(( x )=>console.log("any rejected", x));
pAny.release( true, "releaseAny" );
//p1.resolve( "release1" );
//p2.resolve( "release2" );
*/