另一个应该很简单,但给我带来了麻烦。我正在尝试了解 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."));
}
当它运行时,“完成”警报(我试图推迟)在第一次执行递归脚本后运行,所以它会在只打印一个字母时出现(不是预期的结果)。但是,一旦打印了所有字母并且递归完成,“完成”警报就会正确显示,因此似乎我的 defer 变量直到那时才应该解决。谁能帮我找出为什么在这里提早调用“已完成”警报?任何帮助表示赞赏!
编辑:我意识到我不小心发布了一个稍微旧版本的代码。它已更新为正确的版本(运行时的行为相同)。