等待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 }
指向文档页面的链接:
我正在做这个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的理解。 您肯定需要修改我的示例才能使其正常工作。