単純に文字列を1文字づつ追加していくだけのものですが
See the Pen Text Typewriter with Javascript Promise by KIKIKI (@chaika-design) on CodePen.
※ 表示エフェクトはForkしたものですが、表示ロジックは丸っと作り直ました
PromiseはsetTimeoutを繰り返してもresolveを待つっぽい
エフェクトの終了を取りたかったのでとりあえずPromiseで実装してみたのですが、興味深いことに内部でsetTimeoutを繰り返していても最終的なresolveが実行されるのを待つようです。
実装していた部分
const typewriter = ($elm) => { return new Promise((resolve, reject) => { const typeSpeed = 100; if($elm.length) { const text = $elm.innerText; const chars = text.length; let index = 0; $elm.innerHTML = ''; const write = () => { $elm.innerText += text[index]; if(index < chars) { index += 1; setTimeout(() => write(), typeSpeed); } else { $elm.innerHTML = text; resolve('TYPEWRTER complete'); } }; write(); } else { reject('TYPEWRTER no content'); } }); };
文字列の長さ分setTimeout
を繰り返して最終的にresolve
しています。呼び出し元はこのresolve
を待ってthen
が実行されました。
どうやらPromise
を返す関数は内部にresolve
やreject
が有ることをチェックしてから実行されているっぽいですね。
関数内にresolve
やreject
があるけど、無限ループや動的な条件でresolve
に辿り着けないような関数だとどうなるのでしょう…雰囲気的に待ち続けてしまいそうな気もしますが、タイムアウト的なところでundefined
がresolve
されるのでしょうか? (試す気がない
[参考]

Anker ウルトラスリム Bluetooth ワイヤレスキーボード iOS/Android/Mac/Windows に対応 ホワイト
- 出版社/メーカー: Anker
- メディア: エレクトロニクス
- この商品を含むブログ (1件) を見る

東洋石創 アンティーク小物(タイプライター) 【26513】
- 出版社/メーカー: 東洋石創
- メディア:
- この商品を含むブログを見る