gpt4 book ai didi

javascript - 如何通过 JavaScript 中的回调避免堆栈蠕变?

转载 作者:行者123 更新时间:2023-12-03 00:58:33 26 4
gpt4 key购买 nike

以下 JavaScript 代码模拟用户在 window.alert 上按下“确定”按钮时重试 HTTP 请求的频率。 。可以看到,转储到控制台的堆栈跟踪长度随着请求重试次数线性增加。

要运行此程序,请使用 chromium --user-data-dir=/tmp/"$(uuidgen -r)" --disable-web-security并导航到仅包含最低限度 <html> 的 HTML 文件<body><script>标签。 HTTP 请求需要禁用 Web 安全才能成功,否则默认的 CORS 策略将阻止它。

基本上,问题是:如何防止这种线性堆栈蠕变?

function f() {
console.log("C");
fetch('http://swapi.co/api/films').
then(function (response) {
console.log("D");
return response.json();
}).then(function (response) {
console.log("E");
console.log(response);
console.trace();
window.alert("more?");
f();
});
}

function ignition() {
console.log("B");
f();
}

console.log("A");
window.onload = ignition;

最佳答案

找到了解决办法;它并不理想,因为它涉及 setInterval ,但它是可行的并且可以避免堆栈蠕变。只能直接重试;此解决方案无法在排队函数的调用之间维护任何额外状态,尽管添加起来并不困难。

const self_queue = [];

function self_append(fun) {
self_queue.push(fun);
}

setInterval((function() {
if (self_queue.length > 0) {
const fun = self_queue.shift();

fun(fun);
}
}), 100);

function ajax(url, fun) {
self_append((function (self_fun) {
// ...
// do the HTTP fetch, on success call fun(json)
// on retry, do:
self_append(self_fun);
// ....
}));
}

关于javascript - 如何通过 JavaScript 中的回调避免堆栈蠕变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52711835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com