如果语句导致解析,但分支内没有其他内容

时间:2014-02-10 13:23:32

标签: javascript json qt qml qtquick2

这是一个奇怪的; 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调用的特定行号的错误。

1 个答案:

答案 0 :(得分:4)

如果你问为什么执行if语句,那是因为每次XHR请求的状态发生变化时都会调用onreadystatechange。有5 states for XHR

  • 0:UNSENT(尚未调用open()
  • 1:OPENED(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