もう 1 つは単純なはずですが、問題を引き起こしています。再帰関数が完全に終了するまで特定のアクションを遅らせるために、jQuery の .Deferred() および .promise() 機能について学習しようとしています。現在、私のコードは次のようになっています。
function showText(setTarget, setMessage, setIndex, setInterval) {
var defer = jQuery.Deferred();
var doShowText = function (target, message, index, interval) {
if (index < message.length) {
$(target).append(message[index++]);
setTimeout(function () { doShowText(target, message, index, interval); }, interval);
}
else {
alert("Done!");
defer.resolve();
}
};
doShowText(setTarget, setMessage, setIndex, setInterval);
return defer.promise();
}
function startButtonClick() {
displayElement($("#getElement"));
showText($("#getElement > h1"), "This text will slowly write to the screen.", 0, 50).promise()
.then(alert("Finished."));
}
これが実行されると、再帰スクリプトの最初の実行後に「終了」アラート(私は延期しようとしています)が実行されるため、(意図した結果ではなく)1文字だけが印刷されたときに表示されます。ただし、すべての文字が印刷されて再帰が完了すると、「完了」アラートが正しく表示されるため、それまで遅延変数を解決しないように思われます。ここで「終了」アラートが早期に呼び出されている理由を誰かが発見するのを手伝ってくれますか? どんな支援も大歓迎です!
編集: コードの少し古いバージョンを誤って投稿してしまったことに気付きました。正しいバージョンに更新されています (実行時の動作は同じです)。