Javascript 多次过帐表单,jQuery延迟

Javascript 多次过帐表单,jQuery延迟,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,最近,我在jQuery中使用$.Deferred进行了一些测试,发现了一个问题。虽然延迟和承诺对于只打算运行一次的ajaxcalls来说是很好的,但我也得到了一个表单,用于添加新用户,这些用户使用ajax发布的内容需要能够运行多次。现在,这会与延迟/承诺的二进制状态崩溃,因为一旦它们被解决或拒绝,它将保持该状态。因此,我的问题是: -对于将被多次调用的任务,我是否可以使用延迟? -如果可能的话,是否建议为此使用deferred,还是我应该继续使用旧方法,只使用$.ajax的success/err

最近,我在jQuery中使用$.Deferred进行了一些测试,发现了一个问题。虽然延迟和承诺对于只打算运行一次的ajaxcalls来说是很好的,但我也得到了一个表单,用于添加新用户,这些用户使用ajax发布的内容需要能够运行多次。现在,这会与延迟/承诺的二进制状态崩溃,因为一旦它们被解决或拒绝,它将保持该状态。因此,我的问题是:

-对于将被多次调用的任务,我是否可以使用延迟? -如果可能的话,是否建议为此使用deferred,还是我应该继续使用旧方法,只使用$.ajax的success/error回调

这里是我为发布表单而收集的一些代码,一次效果很好,但不是多次

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实例,但它实现了承诺接口,因此您可以执行$.post….failhandleFailure.donehandleSuccess。但是,您不能在每次发生某些事情时都使用deferred来运行某些代码。

以这种方式使用deferred是没有意义的。延期代表一种行为;不能将其用作事件发射器。当您启动异步操作时,您使用一个延迟操作,并希望在该操作成功或失败时执行某项操作


$.post返回一个承诺实际上它返回一个jqXHR实例,但它实现了承诺接口,因此您可以执行$.post….failhandleFailure.donehandleSuccess。但您不能在每次发生某些事情时都使用延迟对象来运行某些代码。

延迟对象仅在设计时使用一次,这样即使在之后也可以添加回调 一个延迟的问题已经解决,让他们被解雇

从您的代码来看,似乎不清楚为什么您不能:

$("#add_user_form").submit( function(e){
    e.preventDefault();
    $.post( "ajax.php", $(this).serialize() ).then( function(){

    }, function() {

    });
});

延迟对象只有一次是通过设计实现的,这允许用户在延迟之后添加回调 一个延迟的问题已经解决,让他们被解雇

从您的代码来看,似乎不清楚为什么您不能:

$("#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

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

我知道这是一个老话题,前面的答案是解决原始海报问题的完美方案,但是我遇到了同样的问题,多次尝试解析延迟对象,所以我想分享一个解决方案

即使以下情况不可能:

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

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

我会回到直接方法。正如您所发现的,延迟对象不能被多次解析。我将恢复使用直接方法。正如您所发现的,延迟对象不能被多次解析。谢谢您的回答。你在那里发布的代码可以很好地完成这项工作。我问这个问题的原因是,我很好奇deferred是否也可以用于处理可重复的任务,以使我进行ajax调用的方法尽可能相似。感谢伟大的回答,我现在知道我应该坚持用$.post或$.ajax提交表单的旧方式。谢谢你的伟大回答。你在那里发布的代码可以很好地完成这项工作。我问这个问题的原因是,我很好奇deferred是否也可以用于处理可重复的任务,以使我进行ajax调用的方法尽可能相似。感谢伟大的回答,我现在知道我应该坚持用$.post或$.ajax提交表单的旧方式。谢谢你的伟大回答。正是我想知道的:谢谢你的回答。正是我想知道的: