Jquery 返回与ajax对象一起使用的承诺

Jquery 返回与ajax对象一起使用的承诺,jquery,ajax,asynchronous,promise,Jquery,Ajax,Asynchronous,Promise,我有一个传递表单元素的函数,以便使用AJAX处理表单提交 我想从我的函数返回将处理表单提交的ajax对象,这样我就可以附加额外的done回调——问题是我不知道如何在不先创建(并执行)ajax对象的情况下返回它 如何用承诺代替实际的ajax对象,以便返回附加额外回调的内容 HandleModalFormSubmit: function (element) { var form, modalcontainer = $(element).closest('.modal'),

我有一个传递
表单
元素的函数,以便使用AJAX处理表单提交

我想从我的函数返回将处理表单提交的ajax对象,这样我就可以附加额外的
done
回调——问题是我不知道如何在不先创建(并执行)ajax对象的情况下返回它

如何用承诺代替实际的ajax对象,以便返回附加额外回调的内容

HandleModalFormSubmit: function (element) {
    var form,
    modalcontainer = $(element).closest('.modal'),
        modal = $(element).closest('.modal-dialog'),
        ajaxdata;


    if (element.is('form')) form = $(element);
    else {
        form = element.find('form');
    }

    $.validator.unobtrusive.parse(form);

    $(element).on('submit', function (event) {
        event.preventDefault();
        ajaxdata = $.ajax({
            type: form.method,
            url: form.action,
            data: $(form).serialize()
        }).done(function (data) {
            if (data.status == null) {
                modal.html(data);
            } else {
                modalcontainer.modal('hide');
            };
        }).always(function (data) {
            modal.spin(false);
            modal.fadeTo(500, 1);
        });
        modal.fadeTo(300, 0);
        modal.spin();
    });
    var returningobject = {
        element: form,
        ajax: ajaxdata
    };
    return returningobject;
}
}
编辑:下面是我希望函数发生的情况

 var formobject = $Global.HandleAjaxForm(element);
                formobject.ajax.done(function(data1) {
                    if (data1.status == 'ok')
                        window.location.href = (data.redirectToUrl == null) ? "~/Dashboard" : data.redirectToUrl;
                });

尝试创建自己的延迟

HandleModalFormSubmit: function (element) {
    var form,
    modalcontainer = $(element).closest('.modal'),
        modal = $(element).closest('.modal-dialog'),
        ajaxdata, $deferred = jQuery.Deferred();


    if (element.is('form')) form = $(element);
    else {
        form = element.find('form');
    }

    $.validator.unobtrusive.parse(form);

    $(element).on('submit', function (event) {
        event.preventDefault();
        ajaxdata = $.ajax({
            type: form.method,
            url: form.action,
            data: $(form).serialize()
        }).done(function (data) {
            if (data.status == null) {
                modal.html(data);
            } else {
                modalcontainer.modal('hide');
            }
            $deferred.done.apply(this, arguments);
        }).always(function (data) {
            modal.spin(false);
            modal.fadeTo(500, 1);
            $deferred.always.apply(this, arguments);
        }).fail(function () {
            $deferred.fail.apply(this, arguments);
        });
        modal.fadeTo(300, 0);
        modal.spin();
    });
    var returningobject = {
        element: form,
        ajax: ajaxdata
    };
    return $deferred.promise();
}

是否可以将回调附加到函数,并在ajax完成回调中触发该回调?或者,除了向ajax对象附加一个done()监听器之外,您实际上还需要ajax对象本身吗

HandleModalFormSubmit: function (element, callBack) {
    var form,
    modalcontainer = $(element).closest('.modal'),
        modal = $(element).closest('.modal-dialog'),
        ajaxdata;


    if (element.is('form')) form = $(element);
    else {
        form = element.find('form');
    }

    $.validator.unobtrusive.parse(form);

    $(element).on('submit', function (event) {
        event.preventDefault();
        ajaxdata = $.ajax({
            type: form.method,
            url: form.action,
            data: $(form).serialize()
        }).done(function (data) {
            if (data.status == null) {
                modal.html(data);
            } else {
                modalcontainer.modal('hide');
            };

          //call the callback within the done function of the ajax object here
          if(callBack && typeof callBack == "function") callBack.call(context, params);
        }).always(function (data) {
            modal.spin(false);
            modal.fadeTo(500, 1);
        });
        modal.fadeTo(300, 0);
        modal.spin();
    });
    var returningobject = {
        element: form,
        ajax: ajaxdata
    };
    return returningobject;
}
}
很明显,这并没有返回ajax对象本身,但是您可以插入回调并抛出所需的任何参数

编辑: 您还可以返回jQueryAjax函数本身 大概是这样的:

HandleFormSubmit : function(){
   return $.ajax({});
}
然后您可以像这样附加您的“完成”方法:

HandleFormSubmit().done(function(){
});

这可能行得通,但如果有一个要返回的对象,那么我就可以附加不同的回调函数,这样会更有用。哦,我明白你的意思了。上面的答案会行得通的。你也可以返回ajax操作本身。检查对我帖子的编辑。这也可以,但会让我回到原来的问题——我可以返回一个空函数,但这会破坏在单独函数中包装表单处理的意义,因为我每次都必须配置返回的对象。另一方面,我可以返回已配置的函数,但我不希望该函数执行,因为它用于表单提交。我可以等到表单提交后再调用这个函数,但是我不能事先附加回调@上面阿伦的回答做得最好。谢谢你的反馈!但是现在我无法访问ajax对象或表单元素(最初返回)……等等,我看看你现在在做什么。我可以返回延迟对象而不是ajax对象感谢您的回答我花了3个小时才找到您发布的代码的问题所在。你运行过这个代码吗
$deferred.done.apply(此,参数)
应替换为
$deferred.done.resolve(此,参数)
否则
$。when(..).done(..)
。检查这把小提琴