jQuery - 等待函数返回值

Thi*_*zar 3 jquery return function wait

我有一个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;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

现在我想告诉用户邮件是否成功发送或不是这样的:

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

但是当然jQuery在发送邮件之前处理if条件,所以条件是假的:-(我怎么告诉jQuery要等到sendMail完成并返回一些东西?

Sup*_*upr 7

虽然给定的答案是有效的,但我会考虑将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
    });
}
Run Code Online (Sandbox Code Playgroud)

返回值实现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.");
    });
Run Code Online (Sandbox Code Playgroud)

请注意,我从ajax调用中删除了successerror字段,因为它们不需要,但如果您需要其他内容(例如日志记录),您仍然可以使用它们.