2010-11-27 14 views
0

Das ist meine drei Funktionen zu ändern, die ich in javascript bin:Werte der Array-Elemente in JavaScript-Funktionen

function postRequest() 
{ 

    var xmlHttp; 
    if(window.XMLHttpRequest) 
    { // For Mozilla, Safari, ... 
     var xmlHttp = new XMLHttpRequest(); 
    } 
    else if(window.ActiveXObject) 
    { // For Internet Explorer 
     var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlHttp.open('GET', 'effort.php', true); 
    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    xmlHttp.onreadystatechange = function() 
    { 
     if (xmlHttp.readyState == 4) 
     {  
      get_string(xmlHttp.responseText); 
      dij(); 
     } 
    } 
    xmlHttp.send(null); 
} 


function get_string(str) 
{ 
    get_integer = str.split(" "); 
    for(var i=0;i<214;i++) 
    { 
     vertex_i[j] = get_integer[i]*1; 
     j++; 
    } 

    j=0; 
    for(var i=214;i<427;i++) 
    { 
     vertex_f[j] = get_integer[i]*1; 
     j++; 
    } 
    j=0;; 
    for(var i=427;i<517;i++) 
    { 
     x[j] = get_integer[i]*1; 
     j++; 
    } 
    j=0; 
    for(var i=517;i<607;i++) 
    { 
     y[j] = get_integer[i]*1; 
     j++; 
    } 


    for(var m=0;m<90;m++) 
    { 
     for(var n=0;n<90;n++) 
     { 
      L[m][n] = -1;   
     } 
    } 
    for(var m=0;m<212;m++) 
    { 
     x1 = x[vertex_i[m]]; 
     x2 = x[vertex_f[m]]; 

     y1 = y[vertex_i[m]]; 
     y2 = y[vertex_f[m]]; 
     L[vertex_i[m]][vertex_f[m]] = parseInt(find_dist(x1,x2,y1,y2)); 
    } 

} 


function point_it(event) 
{ 
    postRequest(); 


} 

nämlich: point_it(event), dann postRequest(); und schließlich dij();

In diesen Funktionen ich das verwenden Daten in drei global definierten Arrays, deren Elemente aus den vom Server gesendeten Daten abgeleitet werden (Funktion get_string).

wenn ich dij() Funktion innerhalb der postRequest() Funktion (nach dem get_string Funktion aufrufen, bin ich in der Lage, die richtigen Daten innerhalb der Arrays zuzugreifen.

aber wenn ich es unmittelbar nach dem postRequest() Funktion den Wert der Elemente rufen in das Array gleich null sein. ich bin nicht in der Lage, die richtigen Grund dafür zu verstehen und haben mehrere Möglichkeiten ausprobiert, um durchzukommen, aber ohne Fortschritt. CAn mir bitte SM1 helfen!

Antwort

0

postRequest Brände ein asynchronen r Equest zum Server. Wenn Sie eine Funktion direkt danach aufrufen, bedeutet das nicht, dass die Anfrage beendet ist und Sie irgendetwas mit den Antwortdaten machen. Es funktioniert innerhalb postRequest weil das, wo Sie tatsächlich die Verarbeitung der Anfrage und Antwort verarbeiten.

wenn Sie das alles tun will aus Punkt würde ich empfehlen, die folgenden Schritte ausführen:

function postRequest(callback) 
{ 
    var callbackFunc = callback||null; 

    var xmlHttp; 
    if(window.XMLHttpRequest) 
    { // For Mozilla, Safari, ... 
     var xmlHttp = new XMLHttpRequest(); 
    } 
    else if(window.ActiveXObject) 
    { // For Internet Explorer 
     var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlHttp.open('GET', 'effort.php', true); 
    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    xmlHttp.onreadystatechange = function() 
    { 
     if (xmlHttp.readyState == 4) 
     {  
      get_string(xmlHttp.responseText); 

      if(callbackFunc){ 
       callbackFunc(); 
      } 
     } 
    } 
    xmlHttp.send(null); 
} 

function point_it(event) 
{ 
    postRequest(dij); 
} 

dies ermöglicht es Ihnen, den Rückruf zu variieren, die das Array verwendet thats, durch die Post-Anforderung und in einem besiedelt weg, dass es immer nach feuert, dass Anfragezyklus abgeschlossen ist.

+0

oh Wunderkind .... noch einmal wieder .... !!!! ;) –

+0

shud Ich probiere die get Methode? Lassen Sie mich lesen ... –

+0

@prodigy Ich bin mit dieser Art von Problem konfrontiert.Wenn ich Dij-Funktion von innerhalb von PostRequest aufrufen ...... es erhält die richtigen Daten der die ersten drei Ganzzahlen mit Ausnahme der letzten .... ie y []. Wie kann man das durchstehen ... –

0

XMLHttpRequest ist asynchron.

Das bedeutet, es wird zurück, sobald die Anfrage war senden. Wenn Sie jetzt dij() anrufen, ist die Anfrage immer noch ausstehend und get_string wurde noch nicht aufgerufen.

Sobald die Anforderungen abgeschlossen sind, wird der Rückruf aufgerufen und dann get_string ausgeführt.

Sie müssen auch dij() innerhalb des Rückrufs verlassen.

Optisch:

  • postRequest gemacht wird, setzt den Rückruf, aber tut nicht es ausführen, postRequest kehrt dann
  • den Code nach dem Aufruf von postRequest führt
  • einige Zeit vergeht .. .
  • die XMLHttpRequest vervollständigt schließlich und der Rückruf ausführt, die jetzt ruft get_string
0

Globale Variablen sind keine gute Praxis. Es ist besser, die Funktionen get_string und dij mit den Arrays als lokale Variablen innerhalb der einzelnen Funktionen zu kombinieren.