我正在使用直接Web Remoting (DWR) JavaScript库文件,只在Safari(桌面和iPad)中得到一个错误

它说

超过最大调用堆栈大小。

这个错误到底是什么意思,它是否完全停止处理?

Safari浏览器也有任何修复(实际上是在iPad Safari上,它说

JS:执行超时

我认为这是相同的调用堆栈问题)


当前回答

有时是因为转换数据类型,例如你有一个对象,你认为是字符串。

套接字。以nodejs客户端的Id为例,它不是一个字符串。要将它作为字符串使用,你必须在前面添加单词string:

String(socket.id);

其他回答

以下相同代码的调用如果减少1,在我的计算机上的Chrome 32中工作,例如17905 vs 17904。如果按原样运行,它们将产生错误“RangeError:最大调用堆栈大小超出”。这个限制似乎不是硬编码的,而是取决于您机器的硬件。如果作为函数调用,这种自我施加的限制似乎比作为方法调用要高,也就是说,当作为函数调用时,这个特定的代码使用更少的内存。

作为方法调用:

var ninja = {
    chirp: function(n) {
        return n > 1 ? ninja.chirp(n-1) + "-chirp" : "chirp";
    }
};

ninja.chirp(17905);

作为函数调用:

function chirp(n) {
    return n > 1 ? chirp( n - 1 ) + "-chirp" : "chirp";
}

chirp(20889);

你可以在crome浏览器中找到你的递归函数,按ctrl+shift+j,然后source选项卡,它会给你代码编译流程,你可以在代码中使用断点。

在我的例子中,我使用以下方法将一个大字节数组转换为字符串:

String.fromCharCode.apply(null, new Uint16Array(bytes))

字节包含数百万个条目,这对于堆栈来说太大了。

这个问题可能是因为递归调用没有任何终止的基本条件。

就像在我的情况下,如果你看到下面的代码,我有相同的API调用方法和方法,我用来执行操作后的API调用。

const getData = async () => {
try {
  const response = await getData(props.convID);
  console.log("response", response);
 } catch (err) {
  console.log("****Error****", err);
}
};

基本上,解决方案就是删除这个递归调用。

有趣的是,没有人提到异步函数中的等待调用。在我的例子中,我有超过1.5 MB的循环和数据库交互文件。

async function uploadtomongodb() {

    await find('user', 'user2', myobj0).then(result => {
    }

})

等待将删除“超过最大调用堆栈大小”。否则内存负载过多。不确定Node是否可以处理超过700行和对象。