使用jQuery $ .when和$ .then两个函数

时间:2015-05-15 08:02:51

标签: javascript c# jquery asp.net ajax

如果我在$.when().then()方法中进行$.ajax调用,我知道我可以使用$.when。问题在于,当我在$.when方法中调用另一个函数并在$.then方法中调用另一个函数时,我尝试使用这些方法。我在$.when方法中调用的函数最终调用$.ajax方法。

我的问题是,如果我尝试这样做,它就不会回应。我希望它在$.when方法中执行所有操作,然后继续使用$.then方法。

我的初始功能(点击按钮时调用)是:

function HideForm(elem) {
    var valid = ValidateEmailPass(elem);
    var user, email;

    if (valid) {
        user_info_all.style.display = "none";
        ShowMessage(RegErrMsg, "נירשם, אנא המתן..");
        var email = document.getElementById('<%= reg_email.ClientID %>'), pass = document.getElementById('<%= reg_pass.ClientID %>'), age = document.getElementById('<%= reg_age.ClientID %>'),
        username = document.getElementById('<%= reg_user.ClientID %>');
        $.ajax({
            type: "POST",
            url: 'Register.aspx/Register',
            data: '{user: "' + username.value + '", pass: "' + pass.value + '", age: "' + age.value + '", mail: "' + email.value + '"}',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (validated) {
                ShowMessage(RegErrMsg, validated.d);
                if (validated.d.indexOf('נרשמת בהצלחה') == -1) {
                    user_info_all.style.display = "block";
                }
            },
            failure: function (e) {
                $(reg_user_v).toggleClass('validated', false);
                $(reg_user_v).toggleClass('invalid', false);
                $(reg_pass_v).toggleClass('validated', false);
                $(reg_pass_v).toggleClass('invalid', false);
                $(reg_email_v).toggleClass('validated', false);
                $(reg_email_v).toggleClass('invalid', false);
                $(reg_age_v).toggleClass('validated', false);
                $(reg_age_v).toggleClass('invalid', false);
                ShowMessage(RegErrMsg, "אירעה שגיאה בעת ההרשמה, נסה שנית.");
                user_info_all.style.display = "block";
            }
        });
        return true;
    }
    return false;
}

ValidateEmailPass函数调用了多个ajax请求,因此我尝试将此函数放在$.when中,而$.then中的其余函数如下所示:

function HideForm(elem) {
    var valid;
    $.when(function() { 
        valid = ValidateEmailPass(elem); 
    }).then(function() {
        // The rest of the function here
    });
}

1 个答案:

答案 0 :(得分:2)

$。适用于promises。在您的情况下,ValidateEmailPass方法应该返回延迟,因此您必须更改逻辑,如下所示

  1. ValidateEmailPass必须返回$ .Deferred instance。
  2. 验证成功或失败后,在ValidateEmailPass方法中解析/拒绝延迟实例。如果您希望在验证失败的情况下不应调用then部分,则应拒绝延迟。
  3. 引用jQuery.when documentation

      

    如果将单个参数传递给jQuery.when()并且它不是   延期或承诺,它将被视为已解决的延期和   附加的任何doneCallbacks将立即执行。