【问题标题】:Why fetch() exceeds maximum call stack?为什么 fetch() 超过最大调用堆栈?
【发布时间】:2016-06-23 18:01:42
【问题描述】:

这实际上是来自redux-thunk 示例的代码:

function fetchSecretSauce() {
  return fetch('https://www.google.com/search?q=secret+sauce');
}

这是我正在使用的:

const fetch = () => {
    	return fetch('https://www.google.com/search?q=secret+sauce')
    }
    
    console.log(fetch())

如果你“运行代码 sn-p”,你会得到错误:

未捕获的 RangeError:超出最大调用堆栈大小

我也尝试了不同的链接。

【问题讨论】:

  • 仅来自您引用的代码的无回购。也许他们在代码中重新定义了fetch,与新标准相冲突。
  • 你到底在用fetchSecretSauce()做什么?你是如何记录结果的?
  • @JeremyBanks 已修复。
  • 所以您要声明一个名为 fetch 的函数,该函数调用一个名为 fetch 的函数...?

标签: javascript redux-thunk


【解决方案1】:

您的小提琴不正确,不代表您从redux-thunk 提供的示例。在他们的示例中,他们使用名为fetchSecretSauce 的函数包装了fetch 请求。你所做的是声明了一个函数fetch,它调用了一个函数fetch(你刚刚定义的函数),从而通过一遍又一遍地调用自身来创建一个无限循环。

JavaScript 引擎对调用的次数有限制。当达到这个限制时,JavaScript 引擎会这样认为:

我相信这会永远持续下去,所以我会阻止任何不好的事情发生 从发生并立即终止它。我也会给你这个描述 留言:Uncaught RangeError: Maximum call stack size exceeded.

您将在下面找到一个与您的示例完全相同但减去函数名称的示例。点击“Run code sn-p”,你会看到同样的无限循环:

function infiniteLoop() {
  return infiniteLoop('https://www.google.com/search?q=secret+sauce');
}

console.log(foo());

完全按照他们在示例中所做的操作,重命名包装函数完全不同。随意命名,不要将其命名为fetch

function searchGoogleForSecretSauce() {
  return fetch('https://www.google.com/search?q=secret+sauce');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2020-01-05
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2014-08-19
    相关资源
    最近更新 更多