使用 jQuery 延迟多次发布表单

Posting a form multiple times with jQuery Deferred

本文关键字:表单 布表单 jQuery 延迟 使用      更新时间:2023-09-26

我一直在使用$进行一些测试。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

这样,延迟对象永远不会真正解析,但它将允许您根据需要触发任意数量的异步事件调用。也许以这种方式解决问题不是最好的软件设计,但我发现它对我刚刚遇到的情况很有用。