3

我有一个 jquery 函数,用于发送带有 ajax 请求的电子邮件;

function sendMail(from,to,subject,message){
    var datastr="from="+from+"&to="+to+"&subject="+subject+"&message="+message;
    $.ajax({
        type: "POST",
        url: "mail.php",
        data: datastr,
        cache: false,
        success: function(html){
            return true;
        },
        error: function(jqXHR,status,error){
            return false;
        }
    });
}

现在我想告诉用户邮件是否成功发送,如下所示:

$("#feedback").html("Sending email...");
if(sendMail("from@email.com","to@email.com","MySubject","MyMessage"))
   $("#feedback").html("Email sent.");
else
   $("#feedback").html("Error sending email.");

但当然 jQuery 在发送邮件之前会处理 if 条件,因此条件为 false :-( 我如何告诉 jQuery 等到 sendMail 完成并返回一些东西?

4

3 回答 3

8

虽然给定的答案是有效的,但我会考虑将sendmail函数和 DOM 修改分开(即远离$("#feedback").html...回调success/error)。您可以通过返回ajax调用结果来做到这一点:

function sendMail(from,to,subject,message){
    var datastr="from="+from+"&to="+to+"&subject="+subject+"&message="+message;
    return $.ajax({
        type: "POST",
        url: "mail.php",
        data: datastr,
        cache: false
    });
}

返回值实现了 Promise 接口,因此您可以这样做:

$("#feedback").html("Sending email...");
sendMail("from@email.com","to@email.com","MySubject","MyMessage")
    .done(function(){
        $("#feedback").html("Email sent.");
    })
    .fail(function(){
        $("#feedback").html("Error sending email.");
    });

请注意,我从 ajax 调用中删除了successanderror字段,因为它们不是必需的,但是如果您需要它们来做其他事情,例如日志记录,您仍然可以使用它们。

于 2012-07-01T16:31:32.243 回答
0
$("#feedback").html("Sending email...");
$.ajax({
    type: "POST",
    url: "mail.php",
    data: datastr,
    cache: false,
    success: function(html){
       if (sendMail("from@email.com","to@email.com","MySubject","MyMessage")) {
          $("#feedback").html("Email sent.");
       } else {
          $("#feedback").html("Error sending email.");
       }
    },
    error: function(jqXHR,status,error){
        $("#feedback").html("Error sending email.");
    }
});

不知道 sendMail 是什么,但如果那是您检查电子邮件是否已发送,是这样吗?

于 2012-07-01T16:24:26.403 回答
0

您的函数不可能sendMail根据 AJAX 调用的结果返回 true/false(除非您使用同步请求,这几乎总是一个糟糕的主意)。这正是浏览器中 JavaScript 的工作方式,出于充分的理由,我不会在这里讨论。

相反,你必须告诉$.ajax即使成功或失败该做什么。

一种方法如下所示:

$.ajax({
  // omitting arguments for clarity
  success: function(){
    $("#feedback").html("Email sent.");
  },
  error: function(){
    $("#feedback").html("Error sending email.");
  }
});
于 2012-07-01T18:02:16.977 回答