
これを実現するためのshowSpinner関数を作りました。
function showSpinner() { const spinnerFrames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]; let spinnerIndex = 0; const spinner = setInterval(() => { process.stdout.write(`\r\x1b[2K${spinnerFrames[spinnerIndex++ % spinnerFrames.length]}`); }, 80); return () => { clearInterval(spinner); process.stdout.write("\r\x1b[2K"); }; }
コードはこんな感じです↓
- スピナーを表示する
- 80ms経つ
- キャリッジリターン(
\r)でカーソル位置を先頭に戻す \x1b[2Kで現在行の内容をクリア- 次のスピナーを表示する (カーソル位置が先頭に戻ってるので前回のスピナーが上書きされる)
- cleanupされるまで動作を繰り返す。
使い方はこんな感じ↓
const cleanupSpinner = showSpinner(); await asyncFn(); cleanupSpinner();