非同期処理を待機して一番最後に呼ばれたものだけ実行する


キー入力に対してインクリメントに動作するAPI呼び出しの待機処理などに使えるパターンです。
setTimeoutで遅延実行させている間に次の呼び出しがあった場合は、clearTimeoutで前回の呼び出しをキャンセルするので、最後に呼ばれたものだけが実行されます。

非同期処理をそのまま実行する例

index1.js
const data = ['a', 'b', 'c', 'd', 'e'];

const randomInt = function(min, max) {
  return Math.floor( Math.random() * (max + 1 - min) ) + min;
};
const process = name => {
  setTimeout(() => {
    console.log('process:' + name);
  }, randomInt(1000, 3000));
}

data.forEach((value) => {
  process(value)
  console.log(value);
})

// 実行結果
// a
// b
// c
// d
// e
// process:e
// process:d
// process:b
// process:a
// process:c

非同期処理を待機して一番最後に呼ばれたものだけ実行する例

index3.js
const data = ['a', 'b', 'c', 'd', 'e'];

const randomInt = function(min, max) {
  return Math.floor( Math.random() * (max + 1 - min) ) + min;
};

const process = name => {
  setTimeout(() => {
    console.log('process:' + name);
  }, randomInt(1000, 3000));
}


let timeoutId;
data.forEach((value) => {
  clearTimeout(timeoutId);
  timeoutId = setTimeout(() => {
    process(value)
  }, 1000)
  console.log(value);
})

// 実行結果
// a
// b
// c
// d
// e
// process:e