Rethink async tasks with JSX and React style.
Write and compose your complex and domain async tasks via components and use common idioms from React community. Works in any modern javascript environment that supports Promise.
npm install x-task --save
npm install --save-dev babel-plugin-transform-react-jsx
Change default jsx pragma in your .babelrc if you don't use another jsx pragmas (like React, deku, h, etc.)
{
"plugins": [
[
"transform-react-jsx",
{
"pragma": "XTask.createTask"
}
]
]
}
/** @jsx XTask.createTask */
{
"plugins": ["transform-react-jsx"]
}
import { Task } from 'x-task';
class GetUser extends Task {
do() {
return fetch(`/api/users/${this.params.id}`);
}
}
import XTask, { Task, components } from 'x-task';
import { GetCurrentUser, GetUser, GetRecommendedUsers } from '...';
const { Merge, Either, Take } = components;
const task = (
<Merge onResolve={onResolve}>
<Either predicate={predicate}>
<GetCurrentUser />
<GetUser id={id} />
</Either>
<Take from="users" count={1}>
<GetRecommendedUsers />
</Take>
</Merge>
);
task.start();
import XTask, { Task } from 'x-task';
import SomeTask from './SomeTask';
const withContext = (WrappedComponent) => {
return class WithContext extends Task {
getContext() {
return "context";
}
do() {
return (
<WrappedComponent
{...this.params}
getContext={this.getContext.bind(this)}
/>
);
}
};
};
const WrappedChild = withContext(SomeTask);