В такой ситуации, как приведенный ниже код, как вы можете получить доступ к переменной, которая находится в анонимной функции? Я хотел бы вернуть значение bool filterData (xmlhttp.responseText, thisForm); который будет иметь значение boolean для основной функции checkAvailable. Заранее спасибо.Javascript, ссылка на переменную
function checkAvailable(thisForm) {
var xmlhttp = httpRequest();
var isValid = true;
var un = document.getElementById('u_username').value;
var email = document.getElementById('u_email').value;
xmlhttp.onreadystatechange = function(isValid) {
if (xmlhttp.readyState == 4) {
//I WANT TO ACCESS THIS isValid VARIABLE FROM MAIN FUNCTION checkAvailable
isValid = filterData(xmlhttp.responseText, thisForm);
}
}
xmlhttp.open("GET","profile_fetch_reg_info.php?do=available&un="+un+"&email="+email+"",true);
xmlhttp.send(null);
return isValid;
}
так, как я теперь
function validateRegForm(thisForm) {
var isValid = true;
var warningIcon = "";//for later in case we want to use an icon next to warning msg
checkAvailable(thisForm, function(isValid) { });
if(isValid == false)
window.scroll(0,0);
alert(isValid);
return false;//isValidForm;
}
function checkAvailable(thisForm, resultFunction) {
var xmlhttp = httpRequest();
var un = document.getElementById('u_username').value;
var email = document.getElementById('u_email').value;
xmlhttp.onreadystatechange = function(isValid) {
if(xmlhttp.readyState == 4) {
isValid = filterData(xmlhttp.responseText, thisForm);
resultFunction(isValid);
}
}
xmlhttp.open("GET","profile_fetch_reg_info.php?do=available&un="+un+"&email="+email+"",true);
xmlhttp.send(null);
}
быстрые пальцы г-н Фишер;) - удаление моего обманутого ответа и добавление заметки к вашему: любые асинхронные вызовы должны обрабатываться с обратными вызовами вместо возвращаемых значений – gnarf
+1 для использования обратного вызова вместо синхронного ввода-вывода, а также для выполнения это правильно. Ответы gnarf и jvenema вызывают вызов функции Function вне блока if(), который, вероятно, не тот, который вы хотите.Вероятно, вы хотите только вызвать обратный вызов при xmlhttp.readyState == 4, потому что в противном случае вы получите ложные обратные вызовы для других изменений readyState. (В Gecko вы можете получить произвольно большое количество обратных вызовов, если у вас большой или медленный ответ, IIRC.) –
Я на самом деле отредактировал мой, чтобы поместить resultFunc-вызов внутри if, прежде чем я заметил, что ответ Джона побил меня в любом случае , только одно примечание, что funciton (isValid) излишне отображает прочь от значения var isValid, определенного выше. должен быть просто функцией() { – gnarf