我有一个在表单提交后运行的代码。 它基于AJAX请求。 FormSubmit问题是Validation.done(function(){处的FormSubmit函数中Validation.done(function(){我收到一条错误消息,提示未捕获的TypeError:Validation.done不是一个函数 ,但是如果您查看FormValidate函数,它将返回deferredObject.promise ,该问题将在ajax中解决或拒绝完成或失败。

那么问题出在哪里呢?

当用户提交表单时,我们将执行以下操作:

$(document).ready(function() {
    $("#NewOrder").submit(function (e){
        e.preventDefault();
        FormSubmit("NewOrder");
        return false;
    });
});

function FormSubmit(FormId)
{
    var Validation = FormValidate(FormId);
    Validation.done(function(){
       //Do stuff if validation succeeded
    });
}

FormValidate函数:

function FormValidate(FormId)
{
    var deferredObject = $.Deferred();

    var url = "../../ajax/FormValidate";
    var data = {};

    var promise = AjaxRequest(url, data);

    promise.done(function(response) {
        var resultArray = JSON.parse(response);
        var FormEntity = $('#'+FormId).attr('entity');

        if($.isEmptyObject(resultArray)){
            deferredObject.resolve();
        }
        else{
            $.each(resultArray, function( key, value ) {                
                $( "div#"+key+"_validation" ).text(value);              
            });         
            deferredObject.reject();
        }
    });

    promise.fail(function(response) {
        deferredObject.reject();
        console.log(response);      
    });

    return deferredObject.promise;
}

AjaxRequest函数:

function AjaxRequest(url, data)
{
    var deferredObject = $.Deferred();

    var request = $.ajax({
        url: url,
        type: "POST",
        data: data,
    });

    request.done(function (response){
        deferredObject.resolve(response);
    });

    request.fail(function (response){
        deferredObject.reject(response);
    });

    return deferredObject.promise();
}

===============>>#1 票数:2 已采纳

deferredObject.promise是一个函数。 您需要调用它以获得承诺。

return deferredObject.promise();

===============>>#2 票数:0

您正在大量使用延迟的反模式 无需显式构造一个deferred并在给定的.fail / Reject上使用.done.fail处理程序,而只需使用.then方法即可:

function FormValidate(FormId) {
    var url = "../../ajax/FormValidate";
    var data = {};

    return AjaxRequest(url, data).then(function(response) {
        var resultArray = JSON.parse(response);
        var FormEntity = $('#'+FormId).attr('entity');

        if ($.isEmptyObject(resultArray)) return; // resolve with undefined
        $.each(resultArray, function(key, value) {
            $("div#"+key+"_validation").text(value);
        });
        return $.Deferred().reject(resultArray); // if not empty
    }, console.log.bind(console));
}

function AjaxRequest(url, data) {
    return $.ajax({
        url: url,
        type: "POST",
        data: data,
    });
}

然后,使用这些.promise()调用的错字也不会发生:-)

  ask by Eimantas Baigys translate from so

未解决问题?本站智能推荐: