gpt4 book ai didi

javascript - 在 JavaScript 中递归调用 Web 服务会导致 StackOverflow

转载 作者:行者123 更新时间:2023-11-28 18:32:05 26 4
gpt4 key购买 nike

我的迁移过程可能需要 2 到 3 天才能完成。我担心以下实现可能会由于其递归方面而引发 StackOverFlow 异常。 JavaScript 实际上会构建一个巨大的堆栈来执行这段代码吗?如果是这样,更好的实现方式是什么?我可能会调用此服务大约 1000 万次。

function mainFunc() {
var url = getMyUrl();
$.ajax({
url: url,
type: "POST",
contentType: "application/json;charset=utf-8",
dataType: "json",
success: function (remaining) {
if(remaining > 0) {
mainFunc();
}
else {
alert('done');
}
},
error: function (x, e) {
alert('error!');
}
});
}

最佳答案

首先,这听起来绝对不像是应该从浏览器完成的事情,而是应该在服务器端处理。

话虽如此,您的递归是异步发生的,因此肯定不会发生堆栈溢出。
根据您的具体代码(更具体地说,闭包中到底包含哪些值),这可能会开始堆积内存。您还将使用额外的内存,因为每次调用 mainFunc 时都会重新创建成功和错误函数。

您可以通过在 mainFunc 外部声明这些函数,然后在 mainFunc 函数内部传递对它们的引用来相当轻松地解决此函数内存分配问题。

这样做并不能完全避免内存异常的发生。这实际上取决于实际代码以及您在每次迭代中保留的引用。

为了确定您的代码在这个漫长的过程中是否占用了资源,您必须阅读代码并找出代码“泄漏”的位置,或者深入研究内存分析选项:

https://developer.chrome.com/devtools/docs/javascript-memory-profiling

分解闭包的示例:

function mainFuncSuccess(remaining) {
if(remaining > 0) {
mainFunc();
}
else {
alert('done');
}
}


function mainFuncError() {
alert('error!');
}

function mainFunc() {
var url = getMyUrl();
$.ajax({
url: url,
type: "POST",
contentType: "application/json;charset=utf-8",
dataType: "json",
success: mainFuncSuccess,
error: mainFuncError
});
}

关于javascript - 在 JavaScript 中递归调用 Web 服务会导致 StackOverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37797049/

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