Wrapper utility class that enables composition via asynchronous (Promises) and synchronous method chaining.
# npm
npm install --save promise-chain
# yarn
yarn add promise-chain
# pnpm
pnpm install --save promise-chain
import Composable from "https://deno.land/x/promise_chain/mod.ts";
Provided the following class:
class TestClass {
public readonly propertyOne: number;
public readonly propertyTwo: number;
constructor({
propertyOne = 0,
propertyTwo = 0,
}: Partial<TestClass> = {}) {
this.propertyOne = propertyOne;
this.propertyTwo = propertyTwo;
}
async asyncIncrement(
property: string,
increment: number,
): Promise<TestClass> {
return new TestClass({
...this,
[property]: await Promise.resolve(this[property] + increment),
});
}
increment(
property: string,
increment: number,
): Promise<TestClass> {
return new TestClass({
...this,
[property]: this[property] + increment,
});
}
}
Traditionally to chain these methods you would need to do the follwing:
const { propertyOne, propertyTwo } = await testClass
.asyncIncrement("propertyOne", 3)
.then((t) => t.asyncIncrement("propertyTwo", 5))
.then((t) => Promise.resolve(t.increment("propertyTwo", 5)));
console.log(`Result: propertyOne=${propertyOne}, propertyTwo=${propertyTwo}`);
// OUTPUT: "Result: propertyOne=3, propertyTwo=10"
With PromiseChain, it is simplified and easier to read.
const { propertyOne, propertyTwo } = await PromiseChain(testClass)
.asyncIncrement("propertyOne", 3)
.asyncIncrement("propertyTwo", 5)
.increment("propertyTwo", 5);
console.log(`Result: propertyOne=${propertyOne}, propertyTwo=${propertyTwo}`);
// OUTPUT: "Result: propertyOne=3, propertyTwo=10"