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