非同期処理をPromise でシーケンシャルに処理

まあ,車輪の再開発。ただ,Promiseとか難しいこと考えずに,再利用できないとね。。。
rejectは使わないだろうから省略。
resolve もなくしたいけど,非同期ができないからね。。。

var Queue = function() {
  this.promise = Promise.resolve(true);
  this.addAsync = (action) => this.promise = this.promise.then(() => new Promise((resolve) => action(resolve)));
  this.addSync  = (action) => this.addAsync((resolve) => { action(); resolve(); });
  this.delay    = (delay)  => this.addAsync((resolve) => setTimeout(resolve, delay));
};

var list = [
  { id: 1, name: 'taro' },
  { id: 2, name: 'jiro' },
  { id: 3, name: 'saburo' }
];

var q = new Queue();
list.forEach((args) => {
  q.addAsync((resolve) => {
    console.log(args);
    setTimeout(resolve, 1000);
  });
});

list.forEach((args) => {
  q.delay(1000);
  q.addSync(() => console.log(args));
});

参考:
http://kitak.hatenablog.jp/entry/2014/12/01/234759
https://qiita.com/AkihiroTakamura/items/1fdf6dfcb5cb8d5cfc4c