if 语句导致解析,但分支内没有其他内容
Posted
技术标签:
【中文标题】if 语句导致解析,但分支内没有其他内容【英文标题】:If statement causes parsing but nothing else inside the branch 【发布时间】:2014-02-10 13:23:31 【问题描述】:这很奇怪;这个函数在 Qt 中每 1 秒被一个定时器调用一次。查看if
声明;首先它解析一些 JSON 数据,然后记录它正在解析。正如我所料,console.log
仅在fileshow.txt
更改其内容时才会发生。但是 -- var parsed = JSON.parse(t)
的行每 1 秒报告一次解析错误,即使在那一秒内没有发生任何其他事情(包括日志记录):
function get()
var xhr = new XMLHttpRequest;
xhr.open("GET", "/fileshow.txt");
xhr.onreadystatechange = function ()
var t = xhr.responseText;
if (t != tt.lastData)
var parsed = JSON.parse(t);
console.log("parsing");
viewer.newImages(parsed.files);
thetime.shouldRepeat = parsed.repeat;
thetime.fps = parsed.fps;
tt.lastData = t;
thetime.running = true;
xhr.send()
即使我得到一个解析错误(这是一个不同的主题——尽管有错误,数据实际上是正确解析的,因为它通过上述公式路由就好了,程序的其他部分将数据作为预期),除非if
分支实际运行,否则我什至不会看到该源代码行的错误!当 if
分支甚至没有运行时,它如何报告只能在 if
分支中发生的解析错误?!
没有其他地方解析,针对这个JSON.parse调用的具体行号报错。
【问题讨论】:
“这是一个不同的话题——尽管有错误,数据实际上解析正确” 你怎么知道的?这是在方法外执行console.log
调用吗?
@Qantas94Heavy 我正在解析上述代码中所述的数据,并且数据通过我的程序正确路由。我的问题不是关于错误本身的原因,而是当if
分支中没有其他任何事情发生时,如何在上面的代码中进行解析?我的 JSON 还通过了一些在线验证器。
【参考方案1】:
如果您要问为什么会执行 if
语句,那是因为每次 XHR 请求的状态发生变化时都会调用 onreadystatechange
。有5 states for XHR:
open()
尚未被调用)
1:已打开(send()
尚未被调用)
2:HEADERS_RECEIVED(send()
已被调用并且标头和状态可用)
3:正在加载(正在下载;responseText
保存部分数据)
4:完成(操作完成)
因为onreadystatechange
将在它开始加载时被调用,所以您将获得一个部分 JSON 文件,这极不可能验证为正确的 JSON。需要检查readyState
是否为4,即已经加载完毕:
if (xhr.readyState === 4 && xhr.status === 200 && t != tt.lastData)
您可能还想通过检查 HTTP 200 响应来检查请求是否成功。有关XMLHttpRequest
的更多信息,请参阅this MDN article。
【讨论】:
哦,这很漂亮。这不仅解决了if
的内容运行的原因,还修复了解析错误本身。不错!以上是关于if 语句导致解析,但分支内没有其他内容的主要内容,如果未能解决你的问题,请参考以下文章