Newer version available
You’re viewing the API reference for version 3.0.3, but the latest version is 3.1.0. The latest version include may important updates and fixes.
View Latest Versionfunction action
thefrontside/effectionfunction action<T>(operation: (resolve: Resolve<T>, reject: Reject) => Operation<void>): Operation<T>
Create an Operation that can be either resolved (or rejected) with
a synchronous callback. This is the Effection equivalent of new Promise()
.
The action body is itself an operation that runs in a new scope that is destroyed completely before program execution returns to the point where the action was yielded to.
For example:
let five = yield* action(function*(resolve, reject) {
setTimeout(() => {
if (Math.random() > 5) {
resolve(5)
} else {
reject(new Error("bad luck!"));
}
}, 1000);
});
However, it is customary to explicitly suspend inside the body of the action so that whenever the action resolves, appropriate cleanup code can run. The preceeding example would be more correctly written as:
let five = yield* action(function*(resolve) {
let timeoutId = setTimeout(() => {
if (Math.random() > 5) {
resolve(5)
} else {
reject(new Error("bad luck!"));
}
}, 1000);
try {
yield* suspend();
} finally {
clearTimout(timeoutId);
}
});
Type Parameters
T
- type of the action's result.
Parameters
operation: (resolve: Resolve<T>, reject: Reject) => Operation<void>
- body of the action
Return Type
Operation<T>
an operation producing the resolved value, or throwing the rejected error