Проблема с передачей данных из анонимной функции в Ajax и jQuery - PullRequest
0 голосов
/ 26 июля 2011

Мне нужно подтвердить имя пользователя и пароль перед отправкой формы. Для этого я использую jQuery и Ajax. Но у меня проблемы с передачей значения 'estado' вне анонимной функции.

Это код:

function tx_oriconvocatorias_pi1_validarFormPost(){
    var x=document.forms["form_postulante"]["pass_un"];
    if (x.value==null || x.value==""){
        alert("Por favor ingrese su contraseña.");
        return false;
    }
    var $j = jQuery.noConflict();
    var cun = $j('#correo_un').val();
    var pun = $j('#pass_un').val();
    var estado = null;
    $j.ajax({
        type: 'POST',
        data: 'eID=ori_convocatorias_formPost&correo_un='+cun+'&pass_un='+pun,
        success: function(datos){
            if(datos!=1){
                alert ("La contraseña ingresada no es válida"); 
            }
            estado = datos;
            alert(estado);
        },
    });
    alert(estado);
    if (estado!=1){
        return false;
    }
}

Я заметил, что первый alert(estado) (снаружи) возвращает ноль, а затем второй alert(estado) (внутри) возвращает 'datos', поэтому последний alert(estado) в коде выполняется первым, и всегда моя функция возвращает false.

Я не знаю, как оценить 'estado' после выполнения кода Ajax, а не раньше.

Заранее спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 26 июля 2011

Причина, по которой первый alert(estado) равен нулю, а второй alert(estado) равен 'datos', заключается в том, что ajax асинхронный. Это означает, что даже если вы вызываете $ j.ajax, код все еще проходит и оценивает остальную часть функции.

Я думаю, это может быть что-то большее из того, что вы ищете:

function tx_oriconvocatorias_pi1_validarFormPost(){
    var x=document.forms["form_postulante"]["pass_un"];
    if (x.value==null || x.value==""){
        alert("Por favor ingrese su contraseña.");
        return false;
    }
    var $j = jQuery.noConflict();
    var cun = $j('#correo_un').val();
    var pun = $j('#pass_un').val();
    var estado = null;
    $j.ajax({
        type: 'POST',
        data: 'eID=ori_convocatorias_formPost&correo_un='+cun+'&pass_un='+pun,
        success: function(datos){
            if(datos!=1){
                alert ("La contraseña ingresada no es válida"); 
            }
            estado = datos;
            alert(estado);
        },
        error: function(datos) {
            return false;
       }
    });
}
1 голос
/ 26 июля 2011

Вы должны использовать синхронный вызов для достижения этой цели.Но при синхронных вызовах ajax браузер не будет отвечать до тех пор, пока ответ не придет, имейте это в виду.

1 голос
/ 26 июля 2011

Вы не можете.Вы выполняете асинхронный запрос, поэтому ваша функция завершается до того, как возвращается результат вызова ajax.Вы можете сделать так, чтобы вызов был синхронным:

$j.ajax({
        type: 'POST',
        data: 'eID=ori_convocatorias_formPost&correo_un='+cun+'&pass_un='+pun,
        async: false,//here you are synchrone
        success: function(datos){

или вы можете вернуть false и отправить свою форму вручную.

...