2013-02-27 194 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中读取它来重用这个值。 在我的情况下,我还需要在执行第二个功能之前设置一个小超时,以确保