使用 jQuery 延迟多次发布表单
Posting a form multiple times with jQuery Deferred
我一直在使用$进行一些测试。Deferred() 最近在 jQuery 中得到了一个问题。虽然延迟和承诺对于只打算运行一次的 ajaxcall 非常有用,但我也得到了一个用于添加新用户的表单,该表单使用 ajax 的帖子需要多次运行。现在,这会与延迟/承诺的二进制(ish)状态一起崩溃,因为一旦它们被解决或拒绝,它将保持该状态。所以我的问题是:
-我可以对将被多次调用的任务使用延迟吗?-如果可能的话,是建议为此使用延迟,还是应该坚持使用旧方法,只使用 $.ajax 的成功/错误回调?
在这里,我为发布表单收集了一些代码,它一次效果很好,但不会多次。
var submittingUser = new $.Deferred();
var savingUser = submittingUser.pipe(function(data) {
return $.post('ajax.php', data);
});
$("#add_new_user").click(function() {
var data = $("#add_user_form").serialize();
submittingUser.resolve(data);
return false;
});
savingUser.then(function() {
//Success
}, function() {
//Failed
});
以这种方式使用延迟是没有意义的。延迟表示操作;不能将其用作事件发射器。在启动异步操作时使用延迟,并希望在该操作成功或失败时执行某些操作。
$.post()
返回一个承诺(实际上它返回一个 jqXHR 实例,但它实现了 promise 接口),因此您可以执行$.post(...).fail(handleFailure).done(handleSuccess)
。但是,您不能在每次发生某些事情时使用延迟来运行某些代码。
延迟对象仅在设计上一次,即使在设计之后也可以添加回调延期已解决并解雇他们。
从您的代码来看,似乎不清楚为什么您不能只:
$("#add_user_form").submit( function(e){
e.preventDefault();
$.post( "ajax.php", $(this).serialize() ).then( function(){
}, function() {
});
});
古老的话题,之前的答案是原始海报问题的完美解决方案,但我刚刚遇到了同样的一般问题,即多次尝试解决延迟对象,所以我想分享一个解决方案。
即使无法执行以下操作:
var d = $.Deferred();
d.done(function(text){
alert('resolved ' + text);
});
d.resolve('Once'); // prints resolved once
d.resolve('Twice'); // this does nothing as done is only fired once
你可以通过使用jQuery Deferred对象的progress/notice函数来实现完全相同的效果。只需做:
var d = $.Deferred();
d.progress(function(text){
alert('resolved ' + text);
});
d.notify('Once'); // prints resolved once
d.notify('Twice'); // prints resolved twice
这样,延迟对象永远不会真正解析,但它将允许您根据需要触发任意数量的异步事件调用。也许以这种方式解决问题不是最好的软件设计,但我发现它对我刚刚遇到的情况很有用。
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 循环遍历包含另一个表单的表单
- 单击表单中的按钮会导致页面刷新
- 禁用表中的行单击
- HTML可单击表行
- 单击表单的“提交”按钮时,获取表单中的所有INPUT和ACTION标记
- 使用jquery添加到表单内部表中的元素不会过帐
- 单击表单1中的按钮:更改表单2中隐藏输入的值(纯javascript)
- 单击表单中的功能
- 显示带有表单提交的单击事件的 toastR
- 单输入表单 - 特殊情况 |停止表单提交
- 使用 JQuery 在单击表中的 tr 时创建弹出窗口
- 流星 1.3 自动表单/快速表单错误
- 动态表行,将单击事件委派给新添加的元素
- 贝宝表单问题的单选按钮选择
- 克隆完整表并作为表单值提交
- Javascript按钮,它提交联系人表单7表单,然后重定向到URL
- 在表格中单击表单外的操作
- Javascript表单验证:表单在错误返回时提交:
- 当使用jquery单击表行时,选中复选框addclass