等待ajax响应相同的function

我知道类似的问题已被多次发布,但是我已经阅读了很多这样的问题并且无法找到问题的答案。

我有一个等待ajax请求响应的函数。 很多人会问为什么? 好吧,我正在使用一个向导Jquery插件,它在离开一个步骤时执行onLeaveAStepFunction函数,然后如果onLeaveAStepFunction的返回值为true,则向导将转到所选步骤; 否则它仍然在同一步骤。

我正在做这个async: false等待并且它有效,但这是一个糟糕的设计。 另外,我不能使用blockUI插件。

我怎样才能做到这一点?

一些代码:

初始化向导:

 $("#wizard").smartWizard({ onLeaveStep : onLeaveStepFunction, }); 

调用ajax请求:

 function onLeaveStepCallback(obj, context) { nextStep = sendForm(); } 

ajax请求:

 var nextStep = false; $.ajax({ url : path, type : "POST", async : false, data : $("#" + idForm).serialize(), success : function(data) { $("#" + idDiv).html(data); nextStep = !$("#" + idHiddenErrores).val()) } }); 

省略属性。 请帮我。

您可以使用jQuery等待方法。 我从docs页面举了一个例子来强调你是如何做到的:

 $.when( $.ajax( "/request.php" ) ).done(function( response ) { // response argument resolved from ajax requests // process any work after ajax call finishes } 

指向文档页面的链接:

http://api.jquery.com/jquery.when/

我正在做这个async:false等待并且它有效,但这是一个糟糕的设计,我也不能使用blockUI插件。

除非您的向导设计得更好并且支持异步回调(例如,承诺返回的回调),否则async:false是您唯一的选择。

考虑切换到另一个向导,不要忘记为您当前使用的插件提交错误。

一个hackish work-around就是在leaveStep之前做的。 也许在showStep上:

 var wizard_next_step; $("#wizard").smartWizard({ onShowStep : function (obj, context) { onLeaveStepFunction(obj, context, function(nextStep){ wizard_next_step = nextStep; }); }, onLeaveStep : function () { return wizard_next_step; } }); 

您还需要修改onLeaveStepFunction以接受回调:

 function onLeaveStepCallback(obj, context, callback) { nextStep = sendForm(callback); } 

然后你的ajax函数应该是:

 $.ajax({ url : path, type : "POST", async : false, data : $("#" + idForm).serialize(), success : function(data) { $("#" + idDiv).html(data); callback( !$("#" + idHiddenErrores).val()) ); } }); 

现在,看起来您正在使用以下内容进入向导窗口:

 $("#" + idDiv).html(data); 

我完全相信是否是这种情况。 但如果是,那么你不能在这里做到这一点(显然因为它是onShowStep会覆盖当前内容)。 如果是这样,您应该在回调中传递数据:

 success : function(data) { callback( data , !$("#" + idHiddenErrores).val()) ); } 

像这样编写向导:

 var wizard_next_step; var wizard_data; $("#wizard").smartWizard({ onShowStep : function (obj, context) { onLeaveStepFunction(obj, context, function(data, nextStep){ wizard_data = data; wizard_next_step = nextStep; }); }, onLeaveStep : function (obj, context) { $("#" + idDiv).html(wizard_data); return wizard_next_step; } }); 

关键是在调用所有同步函数之前调用所有异步函数并获取数据。

注意:我根本不懂智能向导,也不是一个认真的jQuery用户。 上面的答案基于我在github上阅读智能向导文档的2分钟以及我对javascript的理解。 您肯定需要修改我的示例才能使其正常工作。