javascript - 如何在javascript中等待递归方法调用
问题描述
我正在尝试等待 javascript 中的递归方法调用。这是我启动递归方法的代码:
(async function start() {
await writeText(htmlEditor, 0, time, '#editor');
await writeText(fileSystem, 0, time, '#fileSystem');
await console.log("Hello World");
}).call(this);
这是递归方法:
function writeText(message, index, interval, to) {
return new Promise(resolve => {
let pre;
if (index < message.length) {
pre = document.getElementById('editor');
pre.scrollTop = pre.scrollHeight;
writeChar(message[index++], to);
setTimeout( function () {
writeText(message, index, interval, to);
}, time);
}
})
}
但是,当我使用这段代码时,会同时调用 start 函数中的所有方法。我怀疑这是因为 writeText 函数中的递归调用。
如何等待整个递归堆栈完成?
解决方案
您的writeText
函数不会做任何工作来让消费者了解执行实际完成的时间。setTimeout
用于在这里执行一种“即发即弃”类型的执行。
尝试让它返回一个在工作实际完成时解决的承诺:
function writeText(message, index, interval, to) {
let pre;
if (index < message.length) {
pre = document.getElementById('editor');
pre.scrollTop = pre.scrollHeight;
writeChar(message[index++], to);
// wrap the setTimeout in a promise and proxy the result of the recursive call
return new Promise((resolve, reject) => {
setTimeout( function () {
writeText(message, index, interval, to).then(resolve, reject);
}, time);
});
}
// "base case" I guess, return undefined
return Promise.resolve();
}
推荐阅读
- powershell - WMI 返回非活动笔记本电脑显示器的分辨率
- linux - Ansible 任务写入本地日志文件
- visual-studio-code - 如何通过 Google Chrom 扩展在浏览器脚本中调试 Nuxt
- api - React Native API Fetch 没有完全发生。映射时抛出错误
- c++ - 我无法使用 c++(代码块)中的 fstream 将文件内容复制到另一个。如何运行该文件?
- wordpress - 在保存时自定义 ACF 选项页面值
- android - Android,使用 FFMPEG 分割 GIF 不起作用
- javascript - 如何在 html 中添加更多半列,例如 0.5, 1.5 ,2..5
- java - 检查是否没有application.conf
- event-handling - Outlook Addin 事件处理程序清理