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

标签 javascript ajax web-services recursion asp.net-web-api

我的迁移过程可能需要 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/

相关文章:

php - 使用ajax处理php双数组

node.js - 使用 Node.js 使用 SOAP 服务时无法解析响应错误

android - 使用带有 'Hello World' 的 JSON 作为示例

javascript - 多个 "static"函数的 ES6 模块语法

javascript - 如何使用过滤器将两个数组中的 JSON 对象推送到一个新数组中?

javascript - 使用 knockout 突出显示所选行

javascript - 如何在 jQuery 自定义插件中正确添加多个元素事件

php - 使用 AJAX 从二维 PHP 数组创建二维 jQuery 数组

jquery - 抑制数据表ajax请求中不必要的参数?

c# - 使用网络服务将文档上传到 Sharepoint 2013 Online