等待ajax响应相同的功能
Waiting for ajax response same function
我知道类似的问题已经发布了很多次,但我读了很多遍,找不到问题的答案。
我有一个等待ajax请求响应的函数。你们中的许多人会问为什么?好吧,我使用的是一个Wizard 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等待方法。我从文档页面上举了一个例子来强调你将如何做到这一点:
$.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插件。
除非您的向导设计得更好,并且支持异步回调(例如promise返回回调),否则async:false
是您唯一的选择。
考虑切换到另一个向导,不要忘记为您当前使用的插件提交一个bug。
一个棘手的解决方案是在离开Step之前完成。也许在展示步骤:
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的理解。你肯定需要修改我的例子,使其发挥作用。
- 点击功能没有'ajax调用动态元素(Backbone)后无法工作
- 检查jquery(或ajax)功能是否已完成
- 在动态功能中缓存ajax请求
- 在单模式中断功能中使用Ajax渲染部分
- codeigniter HMVC ajax上的更新功能
- Jquery&Ajax表单验证功能
- 一个Ajax函数能产生另一个Ajax功能吗
- ajax之后的reinit功能
- 无刷新功能的Ajax内容加载
- 在以下情况下,如何使用AJAX实现删除功能
- AJAX具有相同提交/单击功能的多个表单
- jquery ajax调用后,表分类器功能不起作用
- 无法使用ajax序列化功能将图像插入数据库
- jQuery移动Ajax导航功能和CSS样式
- $.ajax后功能安全性
- JQuery,DRY.使用ajax点击功能
- 当有人点击浏览器关闭按钮时,使用JavaScript或ajax功能
- ajax responseText验证功能冻结页面内容(async)
- JQuery AJAX没有't获得成功回调功能
- jQuery重新使用了ajax功能