【问题标题】:Using XMLHttpRequest Timeout使用 XMLHttpRequest 超时
【发布时间】:2017-09-12 18:08:37
【问题描述】:

所以我尝试使用 XMLHttpRequest 的 timeout 属性在数据请求超时时“恢复”我的程序。基本上,如果它无法检索数据,我希望它再试一次。目前我的代码看起来像这样(完整的 URL 被删除以整齐地适应它):

    function pullRequest(){

        var xhr = new XMLHttpRequest()

        xhr.onreadystatechange = function() {
            if (this.readyState === 4) {
                jsonDecode = this.responseText;
                json = JSON.parse(jsonDecode);
                ask = (json.result.Ask);
                bid = (json.result.Bid);
            }
        }

        xhr.open("GET","<URL>",true);
        xhr.send(); 
}

我并没有完全遵循如何实现 timeout 属性,或者它是否会做我想做的事。我确实在xhr.open之后添加了以下两行,但它抛出了错误:

        xhr.timeout = 5000;
        xhr.ontimeout = pullRequest()

如果超时,基本上在我的脑海中,再次运行pullRequest 函数。我敢肯定这可能不是一个好主意,但我没有足够的经验知道为什么。值得一提的错误如下:

...\node_modules\xmlhttprequest\lib\XMLHttpRequest.js:165
    settings = {
    ^

RangeError: Maximum call stack size exceeded at exports.XMLHttpRequest.open 

任何关于如何实现我的目标的建议,或者对我有帮助的一些文献,我们将不胜感激。

谢谢!

【问题讨论】:

  • 我还建议使用if (this.readyState == 4 &amp;&amp; this.status == 200) { 而不仅仅是this.readyState === 4,因为它只检查它是否完成,而不是它是否成功。
  • 几个side-cmets: 1. 要么使用;,要么不使用它们并依赖自动分号插入;不要混搭。 :-) 2. ask = (json.result.Ask); 中的 () 毫无用处。
  • 是的,我编写的代码是许多已启动、已停止和已重新启动的版本的混合搭配。据我所知,我做的事情更正确,但你看到的旧代码仍然存在“不正确”的格式。我得把它全部清理干净! FWIW我通常使用“;”。同样在我的辩护中,我的兄弟写了 json.result 行,他对编码的了解甚至比我还少:)

标签: javascript node.js xmlhttprequest


【解决方案1】:

问题是你在 打电话 pullRequest:

xhr.ontimeout = pullRequest()
// ------------------------^^

由于它立即调用自己,然后再次调用自己,再调用自己等等,最终在达到环境的最大递归级别时,它会出栈。

您不想在此处调用它,您只想将函数引用分配给ontimeout,以便如果发生超时,您的函数会被调用:

xhr.ontimeout = pullRequest
// No () ------------------^

【讨论】:

  • 简单修复!我怀疑发生了这样的事情,但我有限的知识意味着我看不出问题出在哪里。我会对其进行测试,尽管有时我必须让我的代码运行几天才能暂停,因为我调用的 API 非常强大。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2012-03-19
  • 2011-04-25
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多