deferral.js
Version:
Mange your async task more easy.
92 lines (73 loc) • 1.77 kB
JavaScript
import Task from './task';
import Stream from './stream';
import Scheduler from './scheduler';
const queue = (tasks, ...params) => {
if(!Array.isArray(tasks)) {
throw new TypeError();
}
if(tasks.some(task => !(task instanceof Task))) {
throw new TypeError();
}
return new Promise((resolve) => {
const result = [];
let task;
(async () => {
while(task = tasks.shift()) {
const ret = await task.run(...params);
result.push(ret);
}
resolve(result);
})();
});
};
const pipe = (tasks, data) => {
if(!Array.isArray(tasks)) {
throw new TypeError();
}
if(tasks.some(task => !(task instanceof Task))) {
throw new TypeError();
}
return new Promise((resolve) => {
let task;
let result = data;
(async () => {
while(task = tasks.shift()) {
result = await task.run(result);
}
resolve(result);
})();
});
};
const all = (tasks, ...params) => {
if(!Array.isArray(tasks)) {
throw new TypeError();
}
if(tasks.some(task => !(task instanceof Task))) {
throw new TypeError();
}
return Promise.all(tasks.map(task => task.run(...params)));
};
const hash = (tasksHash, ...params) => {
if(typeof tasksHash === 'object' && tasksHash.constructor === Object) {
const keys = Object.keys(tasksHash);
if(Object.values(tasksHash).some(task => !(task instanceof Task))) {
throw new TypeError();
}
return Promise
.all(keys.map(key => tasksHash[key].run(...params)))
.then(results => keys.reduce((map, key, index) => {
map[key] = results[index];
return map;
}, {}));
}
throw new TypeError();
};
export default {
hash,
queue,
all,
pipe,
Task,
Scheduler,
Stream
};