9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[JavaScript] 一旦タスクをためて、後から順番に実行する [Promise|タスク処理]

Last updated at Posted at 2017-08-07

様々な処理を行う中で、一旦タスクをためておいて、後から順番に実行したい。
という場面に出会ったので、そのときに実装した内容です。

エラーキャッチしたときに、その後のタスクをどうしたいかで、
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);
  });
9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?