2015-08-10 5 views
0

Как восстановить переменную returndata вне функции fn()?Функция JavaScript var вне функции

function fn() { 
    var xmlhttp = new XMLHttpRequest(); 
    var vars = "request=something"; 

    xmlhttp.open("POST", "script.php", true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

    xmlhttp.onreadystatechange = function() { 
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
      var returndata = xmlhttp.responseText; 
     } 
    } 

    xmlhttp.send(vars); 
} 
+0

Читайте о [JS] прицелы (http://www.w3schools.com/js/js_scope.asp) – suvroc

ответ

2

Необходимо определить глобальную переменную перед функцией и затем сохранить результат в этой переменной. То, как вы это делаете сейчас, - это определение локальной переменной.

var returndata; 
function fn() { 
    var xmlhttp = new XMLHttpRequest(); 
    var vars = "request=something"; 

    xmlhttp.open("POST", "script.php", true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

    xmlhttp.onreadystatechange = function() { 
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
      returndata = xmlhttp.responseText; 
     } 
    } 

    xmlhttp.send(vars); 
} 
+0

Обратите внимание, что возвращаемые данные будут * не * имеют значение пока запрос не будет завершен, поэтому, если вы попробуете что-то вроде этого 'fn(); console.log (returndate); ' не ожидают вывода. – Abhinav

1

Запросы AJAX являются асинхронными. У вас не может быть пицца до ее выпечки. В реальной жизни вы называете компанию пиццы. Они выпекают его, и вы ждете. AJAX - то же самое. Поэтому установка returndata не будет делать это сама по себе.

function fn() { 
    var xmlhttp = new XMLHttpRequest(); 
    var vars = "request=something"; 

    xmlhttp.open("POST", "script.php", true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

    xmlhttp.onreadystatechange = function() { 
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
      var returndata = xmlhttp.responseText; 
     } 
    } 

    xmlhttp.send(vars); 
}  

Функция readystate не существует ни для чего. Он ждет, пока запрос не будет обработан. Оттуда вы можете продолжать. Каждая функция/сценарий, зависящий от возвращаемых данных, должна быть вызвана из этой функции.

Тем не менее вы можете сделать это:

var returndata; //this will now be a global variable. 
function fn() { 
    var xmlhttp = new XMLHttpRequest(); 
    var vars = "request=something"; 

    xmlhttp.open("POST", "script.php", true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

    xmlhttp.onreadystatechange = function() { 
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
      var returndata = xmlhttp.responseText; 
      doSomeThing(); //fire depended value. 
     } 
    } 

    xmlhttp.send(vars); 
} 

function doSomething() 
{ 
    if(returndata) 
    { 
     //do Something 
    } 
    else 
    { 
     alert("Data isn't loaded yet"); 
    } 
}  
Смежные вопросы