繁体   English   中英

使用jQuery Deferred多次发布表单

[英]Posting a form multiple times with jQuery Deferred

我最近在jQuery中使用$ .Deferred()进行了一些测试并得到了一个问题。 虽然deferred和promises非常适合只打算运行一次的ajaxcalls,但我还有一个用于添加新用户的表单,带有ajax的帖子需要多次运行。 现在这与延迟/承诺的二进制(ish)状态崩溃,因为一旦它们被解决或被拒绝它将保持该状态。 所以我的问题是:

- 我可以将deferred用于多次调用的任务吗? - 如果可能的话,是否建议使用deferred,或者我应该只使用$ .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()返回一个promise(实际上它返回一个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 / notify函数来实现完全相同的效果。 做就是了:

var d = $.Deferred();
d.progress(function(text){
   alert('resolved ' + text);
});
d.notify('Once'); // prints resolved once
d.notify('Twice'); // prints resolved twice

通过这种方式,您的延迟对象永远不会真正解决,但它可以让您根据需要启动任意数量的异步事件调用。 也许这不是以这种方式解决问题的最佳软件设计,但我发现它对我刚刚拥有的情况很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM