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(..)
。检查这把小提琴