jQuery ajax ожидает процесс ответа php

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

LoadingProccess();
var FormData = $('#subscribe').serialize(); 
$.ajax({
    type: "POST",
    url: "proses_corporate.php",
    data: FormData,
    cache: false,
    dataType: "json",
    success: function(data){
        var cek = data.result;
        $.unblockUI();
        if(cek=='Success'){
        $('#subscribe')[0].reset();
        $.blockUI({ 
            message:  '<h4>'+data.status+'</h4>', 
            timeout:   8000 ,
            css: {
              top:  ($(window).height() - 100) /2 + 'px', 
              left: ($(window).width() - 650) /2 + 'px',
              width: '650px'
        }); 
            setTimeout(function() { 
                window.location.href = 'http://www.domain.com/';
            }, 8000);
    }
      setTimeout(function() { 
          window.location.href = 'http://www.domain.com/';
      }, 8000);
    }
   },
         error: function() {
            alert('Error');
         }

});

Сценарий: когда я отправлю, приложение будет заблокировано и отобразит пользователю информацию о том, что процесс идет. Для этого php требуется несколько секунд для обработки отправки почты через smtp gmail.

В моем php echo json_encode дает команду jquery отображать информацию об успешном завершении процесса. Мой код php:

function smtpmailer($to, $from, $from_name, $subject, $body) { 
    global $error;
    $mail = new PHPMailer();  // create a new object
    $mail->IsSMTP(); // enable SMTP
    $mail->SMTPDebug = 0;  // debugging: 1 = errors and messages, 2 = messages only
    $mail->SMTPAuth = true;  // authentication enabled
    $mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for GMail
    $mail->Host = 'smtp.gmail.com';
    $mail->Port = 465; 
    $mail->Username = GUSER;  
    $mail->Password = GPWD;           
    $mail->SetFrom($from, $from_name);
    $mail->Subject = $subject;
    $mail->Body = $body;
    $mail->AddAddress($to);
    if(!$mail->Send()) {
        $error = 'Mail error: '.$mail->ErrorInfo; 
        return $error;
    } else {
        $error = 'Message sent!';
        return $error;
    }
}

С использованием

smtpmailer('[email protected]','[email protected]','GMAIL','Testing Form GMail','Test...Test...Test...Test...');
echo json_encode(array('status' => 'Data has been sent.', 'result' => 'Success'));

Как и в приведенном выше коде, форма будет перенаправлена ​​​​на определенную страницу после успешного завершения процесса. В моем случае, как jQuery дождаться результатов динамического php, прежде чем перевернуть страницу?

Нужно ли использовать timeout: 10000 для jQuery? Вроде не динамично, потому что часы выставлены вручную. Есть ли другой способ?


person Bertho Joris    schedule 02.04.2013    source источник
comment
Вы хотите перенаправить на другую страницу в случае успеха и показать сообщение об ошибке, если произошла какая-либо ошибка?   -  person Amit    schedule 02.04.2013
comment
да .... Но после процесса php   -  person Bertho Joris    schedule 02.04.2013
comment
Вы можете добавить блок else для оператора if(cek == 'Success') и показать ошибку/перенаправить на другую страницу, если процесс PHP не возвращает успех   -  person Amit    schedule 02.04.2013
comment
Я сделал блок еще, но если процесс завершится неудачно. Что я имею в виду в своем вопросе, так это процесс успешного   -  person Bertho Joris    schedule 02.04.2013
comment
Извините, но я так и не понял вашего вопроса   -  person Amit    schedule 02.04.2013


Ответы (3)


вы увеличиваете время ожидания запроса ajax при ожидании ответа. например

$.ajax({
    type: "POST",
    url: "proses_corporate.php",
    data: FormData,
    cache: false,
    timeout: 30000, // 3 second
    dataType: "json",
    success: function(res){   }, 
    failed: function(err){   }
}
person novalagung    schedule 02.04.2013

Вы можете поместить маску на страницу и сделать ее видимой на ajaxStart(), а затем скрыть или перенаправить страницу. в функциях ajaxStop()

person Onur Kucukkece    schedule 02.04.2013

вы можете использовать функцию beforeSend, чтобы добавить маску. а в функции «Завершить» удалите маску.

person IdanHen    schedule 02.04.2013