様々な処理を行う中で、一旦タスクをためておいて、後から順番に実行したい。
という場面に出会ったので、そのときに実装した内容です。
エラーキャッチしたときに、その後のタスクをどうしたいかで、
rejectやcatch周りは書き方変わりそうです。
Tasks.js
/**
* タスク管理用親クラス
*/
class Tasks {
constructor () {
this.tasks = [];
this.messages = [];
}
/**
* タスク追加
* @param {function} task
*/
pushTask (task) {
if (typeof task === 'function')
this.tasks.push(task);
}
/**
* メッセージ追加
* @param {string} message
*/
pushMessage (message) {
this.messages.push(message)
}
/**
* タスクの実行
* @returns {Promise}
*/
execTasks () {
return this.tasks.reduce((prevTask, next) => {
return prevTask
.then(next)
.then(msg => {
if (msg) {
this.pushMessage(msg);
}
return Promise.resolve()
})
.catch((err) => {
return Promise.reject(err)
})
}, Promise.resolve());
}
}
export default Tasks;
SampleTasks.js
import Tasks from './Tasks';
/**
* サンプルタスク用クラス
*/
class SampleTasks extends Tasks {
/**
* サンプルタスクの生成
*/
createSampleTask (number) {
this.pushTask(() => {
console.log('START: ' + number);
return new Promise((resolve, reject) => {
// 非同期処理 (APIなりファイル操作なりの処理をここに記述する)
setTimeout(() => {
console.log('FINISH: ' + number);
resolve('sample task ' + number + ' 終了');
}, 1000)
})
})
}
}
export default new SampleTasks();
app.js
import SampleTasks from './SampleTasks'
// タスク作成
SampleTasks.createSampleTask(1);
SampleTasks.createSampleTask(2);
SampleTasks.createSampleTask(3);
// タスク実行
SampleTasks.execTasks()
.then(() => {
// 全タスク終了時
console.log(SampleTasks.messages);
});