这是一个奇怪的; 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调用的特定行号的错误。
答案 0 :(得分:4)
如果你问为什么执行if
语句,那是因为每次XHR请求的状态发生变化时都会调用onreadystatechange
。有5 states for XHR:
open()
)send()
尚未被召唤)send()
已被调用,标题和状态可用)responseText
保存部分数据)因为onreadystatechange
在开始加载时会被调用,所以你会被传入一个部分JSON文件,这个文件极不可能被验证为正确的JSON。您需要检查readyState
是否为4,即它已完成加载:
if (xhr.readyState === 4 && xhr.status === 200 && t != tt.lastData) {
您还可能希望通过检查HTTP 200响应来检查请求是否成功。有关XMLHttpRequest
的详细信息,请参阅this MDN article。