Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > массив обнуляется или обрабатывается раньше чем на


Автор: z006 12.6.2009, 20:46
Код

var userscolarr= new Array(); 
function getstartpos() 
{ 
  url="getbattleusersposition.php?name="+window.nn; 
    function getXMLHttpRequest()  
     { 
      var xmlhttpreq=null; 
      if (window.XMLHttpRequest) //Mozilla, Safari & IE 7 
       { 
    xmlhttpreq = new XMLHttpRequest(); 
       } 
      else if(window.ActiveXObject) // IE 6 and later 
       { 
    try  
    { 
     xmlhttpreq = new ActiveXObject('Msxml2.XMLHTTP'); 
    } 
    catch(err)  
    { 
     xmlhttpreq = new ActiveXObject('Microsoft.XMLHTTP'); 
    } 
       } 
      return xmlhttpreq; 
     } 
    function sendRequest(method, url, param) 
     { 
      var request = getXMLHttpRequest(); 
      request.open(method, url, true); 
      request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded'); 
      request.onreadystatechange = function()  
       { 
    handleAjaxResponse(request); 
       }; 
      request.send(param); 
     } 
    function isSuccess(request) 
     { 
      return request.status == 0 || (request.status >= 200 && request.status < 300); 
     } 
    function handleAjaxResponse(request) 
     { 
   if(request.readyState == 4)  
       { 
    if(isSuccess(request)) 
     { 
      var responseXML = request.responseXML; 
      var root = responseXML.getElementsByTagName('response').item(0); 
      var responseID = Array(); 
      var responseValue = Array(); 
          var usersaa= new Array(); 
      for (var iNode = 0; iNode < root.childNodes.length; iNode++)  
       { 
        var node = root.childNodes.item(iNode); 
        for (ik = 0; ik < node.childNodes.length; ik++)  
         { 
          var block = node.childNodes.item(ik); 
          if (block.nodeType != 1)  
          continue; 
          switch(block.nodeName) 
           { 
        case "names": 
                 usersaa[block.firstChild.nodeValue]= new Array(); 
                 persname=block.firstChild.nodeValue; 
                 userscolarr[ik]=block.firstChild.nodeValue; 
alert("userscolarr fist="+userscolarr[0]); 
        break; 
        case "position": 
                 var flpos=parseFloat(block.firstChild.nodeValue); 
                 usersaa[persname]['persX']=cell[flpos]['x']-10; 
                 usersaa[persname]['persY']=cell[flpos]['y']-70; 
        break; 
           } 
         } 
       } 
      for(ik=0; responseID.length; ik++) 
       { 
        document.getElementById(responseID.pop()).innerHTML = responseValue.pop(); 
       } 
     } 
       } 
     } 
sendRequest('GET', url, null); 
}; 
function map_array() 
{ 
getstartpos(); 
var a=1; 
var m=''; 
while (a<155) 
 { 
  m+='<img src="no1.gif" alt='+a+' id='+a+' style="position: absolute; left: '+cell[a]['x']+'px; top:'+cell[a]['y']+'px;" onMouseOver="kurin('+a+')" onMouseOut="kurout('+a+')" onmouseup="move('+a+')">'; 
  a=a+1; 
 } 
 map_out('battlediv',m); 
alert("userscolarr="+userscolarr[0]); 


для чего эта часть кода-не спрашивайте.излагаю проблемму:в функции getstartpos() в массив userscolarr мы добавляем имена.на данный момент туда вносится всего одно имя,и оно "1".
тут alert("userscolarr fist="+userscolarr[0]); выводится нормально userscolarr fist=1
но вот тут alert("userscolarr="+userscolarr[0]) ,это в конце кода,выводится userscolarr=undefined
может быть что скрипт не дожидается завершения функции getstartpos() и идет дальше,и соответственно не знает значение userscolarr[0],или этот массив каким-то чудом обнуляется?

Автор: youri 12.6.2009, 21:02
Цитата(z006 @  12.6.2009,  20:46 Найти цитируемый пост)
может быть что скрипт не дожидается завершения функции getstartpos() и идет дальше,и соответственно не знает значение userscolarr[0],или этот массив каким-то чудом обнуляется?

угадал smile первый alert выполняется по завершению асинхронного запроса, а второй - сразу после отправки

Автор: z006 12.6.2009, 22:01
блин,а как его заставить дождаться окончания выполнения запроса?не тулить-же в тупую задержку туда...

Автор: Aliance 15.6.2009, 15:24
Сделать Callback-функцию в которой писать все команды, которые должны выполнится после ответа от сервера.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)