2013-02-27 112 views
0

我有follwing功能:JS功能不返回返回

function anfahrtskosten() 
{ 
    var xmlhttp; 
    var entfernung=0; 
    var anfahrtskostenergebnis=0; 
    var anfahrtskostenergebnis1=0; 
    var plz=document.modhochzeitskalk.plz.value; 
    //aus den Parametern 
    var anfahrtskosten=1; 

    if (window.XMLHttpRequest) 
      {// code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp=new XMLHttpRequest(); 
      } 
    else 
      {// code for IE6, IE5 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
      } 
    xmlhttp.onreadystatechange=function() 
      { 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) 
       entfernung = xmlhttp.responseText; 
       if (entfernung > 100 && entfernung < 2000) { 
        anfahrtskostenergebnis1 = anfahrtskosten * entfernung; 
       } else { 
        anfahrtskostenergebnis1 = 0; 
       } 
        anfahrtskostenergebnis = Math.round(anfahrtskostenergebnis1); 
        document.getElementById("anfahrtskostenergebnis").innerHTML=anfahrtskostenergebnis+",00 &euro;"; 
      } 
    xmlhttp.open("GET","/modules/mod_hochzeitskalk/ogdb_remote.php?plzstart=10245&plzend="+plz,true); 
    xmlhttp.send(); 
    return anfahrtskostenergebnis; 
} 

我想用另一個函數內存儲在var anfahrtskostenergebnis數量,我想這樣的:

var gesamtkosten = anfahrtskosten() + videokosten() + filmkosten() + fotokosten() + extrakosten(); 

但它不工作,我做錯了什麼?

+2

** A ** jax。 ** A **部分。 (第一個答案。第二個答案很簡單。) – 2013-02-27 14:12:43

+0

AJAX中的「A」是異步的,意味着它可能*在你的函數執行之後纔會得到響應。 – scunliffe 2013-02-27 14:13:18

+0

我的大腦剛剛爆炸。 – 2013-02-27 14:14:17

回答

1

,你可以不會繼續處理,直到AJAX調用返回,調用是Asynchronous,意味着程序流繼續,AJAX調用在並行線程中運行。另一種方法是停止所有腳本活動,等待網絡流量緩慢以提供結果。

您需要重新構造程序t o使用回調函數,在之後的值通過AJAX返回後稱爲

這應該讓你開始,但是我懷疑你將不得不爲你添加在一起的其他函數做類似的事情,並且跟蹤已經收集的值的某種方式,一旦運行了最後的回調全部檢索。

function anfahrtskosten(){ 
    var xmlhttp; 

    ... your original code here... 

        anfahrtskostenergebnis = Math.round(anfahrtskostenergebnis1); 

        // call the callback here, with the value you retrieved 
        callback(anfahrtskostenergebnis); // <~~~~ 
        document.getElementById("anfahrtskostenergebnis").innerHTML=anfahrtskostenergebnis+",00 &euro;"; 
      } 
    xmlhttp.open("GET","/modules/mod_hochzeitskalk/ogdb_remote.php?plzstart=10245&plzend="+plz,true); 
    xmlhttp.send(); 
} 

var callback = function(anfahrtskosten){ 
    var gesamtkosten = anfahrtskosten + videokosten() + filmkosten() + fotokosten() + extrakosten(); 
    // do something with cost... 
} 
+0

首先感謝這個非凡的快速和定性的答案! 所以我只需要添加 '回調(anfahrtskostenergebnis);' 在你提出的第一個功能,但我真的不明白是怎麼第二個功能,應該是這樣的: '函數gesamtkosten(){ VAR gesamtkosten = anfahrtskosten()+ videokosten()+ filmkosten()+ fotokosten()+ extrakosten(); document.getElementById('gesamtkosten')。innerHTML = gesamtkosten +「,00 €」; }' – 2013-02-27 14:57:23

+0

我在底部有一個回調函數的例子。它只處理'anfahrtskosten',但如果其他元素相似,則必須按順序處理它們,每個處理都會導致回調,或者必須異步觸發它們,並且在每個回調中檢測所有部分收集,然後調用最終功能,做你最初的目標。 – 2013-02-27 15:45:58

1

你缺少開始括號「{」如果(xmlhttp.readyState == 4後......(即,你如果因爲你正在使用AJAX只是執行的第一條語句)

+1

這是一條評論,而不是答案,我不認爲你是正確的。我認爲他已經放了一個非支撐的if語句,並將其錯誤地縮進。我認爲'if'似乎是最後的大括號,實際上是它上面的函數的最後一個大括號。爲了清晰起見,在if語句中加上大括號會更好。 – 2013-02-27 14:24:53

+0

評論。是的,評論。抱歉。謝謝! – mmixLinus 2013-02-27 14:27:53

0

一個非常簡單的解決方案或復飛是在文檔中的某處存儲varibale在innerHTML的,我在我的例子

的document.getElementById(「anfahrtskostenergebnis」)做了。innerHTML的= anfahrtskostenergebnis +」 ,00 €「;

所以第二個函數可以通過從innerHTML中讀取它來重用這個值。 在我的情況下,我還需要在執行第二個功能之前設置一個小超時,以確保