2014-07-05 122 views
-1

我想從一個網絡服務器獲取數據,它必須由不同的功能處理,直到顯示出來。我的問題是,當xmlhttprequest是異步的,那麼處理函數已經被調用,但數據不可用。我如何確保異步調用完成? 我知道readyState和狀態屬性。如果響應需要更長時間,則同步呼叫無助於凍結瀏覽器。我只能使用純JavaScript,處理數據的函數只能稍微改變。如何確保Xmlhttprequest(異步)完成?

編輯:

以下結構是我的問題(抽象,在現實中多個不同版本的情況發生了):

  • 功能loadData:不會的XMLHttpRequest(異步)
  • 功能A:調用loadData ,先調用
  • 函數B:調用loadData,調用第二個
  • 函數C:調用A和D以及第一個調用
  • 功能d:第一執行一些計算
  • 功能:顯示HTML元素基於輸入
  • 功能秒:顯示其他HTML元素

實施例的程序運行:

  • JS自動調用功能A顯示圖表
  • 用戶按下按鈕並調用功能B,顯示不同的圖表
  • 用戶按下不同的按鈕調用函數C

問題:(?這可能是由新的參數來識別) 在功能上,功能首先需要的數據,但不能從loadData的onreadystatechange因爲有幾個不同的上下文中被調用例如函數B的調用。

我認爲只有通過更改onreadystatechange中loadData和條件語句的新參數的結構才能實現,然後onreadystatechange會調用需要來自Web服務器的不同函數。不幸的是,在調用另一個函數之前,將包括部分計算或完成的工作(來自函數A,B,C)。這基本上打破了邏輯分離。 是否有任何其他方式在現有代碼中需要更少的更改?

回答

0

所有的處理功能必須在XHR對象的onreadystatechange方法中執行。

xmlhttp.onreadystatechange=function() { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
    //all your processing depending on your response (xmlhttp.responseText) must happen here 
    } 
} 
+0

這當然有效。但是一個特定的功能非常棘手。它被在不同情況下調用的幾個函數使用。因爲我認爲沒有簡單的解決方案,但建立了不同的結構 – John

+0

雖然你的回答是正確的,但我想看看在接受之前是否有其他方式可能會有人知道。我不能投票你的答案,因爲我沒有足夠的聲譽。 – John

0

像以下:

var ajax = new XMLHttpRequest(); 
ajax.open("GET","link.php?a=a"); 
ajax.send(); 
ajax.onreadystatechange = function() { 
    if (ajax.readyState != 4 || ajax.status != 200) return; // data is available from next line 
     alert(ajax.responseText); 
};