2014-02-10 60 views
2

這是一個奇怪的;這個函數在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

_「這是一個不同的主題 - 儘管出現錯誤,數據實際上是正確解析」_你怎麼知道這一點?這是從方法外執行'console.log'調用嗎? –

+0

@ Qantas94Heavy我正在解析上述代碼中提到的數據,數據正確地通過我的程序進行路由。我的問題不是關於錯誤本身的原因,而是當'if'分支中沒有其他事情發生時,在上述代碼中如何發生解析?我的JSON也通過了一些在線驗證器。 – johnbakers

回答

4

如果你問爲什麼if語句執行,這是因爲onreadystatechange被稱爲每次的XHR請求的狀態發生變化的時間。有5 states for XHR

  • 0:UNSENT(open()還沒有被稱爲尚未)
  • 1:打開(send()還沒有被稱爲尚未)
  • 2:HEADERS_RECEIVED(send()已經調用了頭和狀態是可用的)
  • 3:LOADING(下載; responseText保持部分數據)
  • 4:DONE(完成操作)

因爲onreadystatechange在開始加載時會被調用,所以您會收到部分JSON文件的傳遞,這很可能無法驗證爲正確的JSON。你需要檢查readyState是4,也就是說,它已完成加載:

if (xhr.readyState === 4 && xhr.status === 200 && t != tt.lastData) { 

您還可能要檢查請求是通過檢查一個HTTP 200響應成功。有關XMLHttpRequest的更多信息,請參見。

+0

哦,這是美麗的。這不僅解決了爲什麼'if'的內容正在運行,它還修復瞭解析錯誤本身。太好了! – johnbakers