作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下 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/
我是一名优秀的程序员,十分优秀!