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:

0:未发送(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 语句导致解析,但分支内没有其他内容的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 SVN 分支内的目录?

Shell 编程规范与变量

Shell编程之条件语句

仅当字符串包含指定的内容但没有其他内容时,正则表达式匹配

我如何检查按钮内的文本内容。 if 语句无法识别文本

《Python学习手册 第五版》 -第12章 if测试和语法规则