我似乎遇到了典型的“异步问题”,解决方案无法解决。暂停函数执行流程直到ajax请求完成
我有一个bootstrap form wizard这只是一个即兴创作的标签/幻灯片有点儿。我所有的“步骤”都是各自标签页/幻灯片中的表单。
它有一组下一个/上一个按钮来浏览幻灯片。 它在移动到下一张幻灯片之前提供函数回调。 里面(回调)我是“客户端验证”在当前幻灯片的形式,如果验证,然后我提交表单使用Ajax。一旦我得到服务器的响应,我决定是否返回true(继续下一张幻灯片)或返回false(停止导航到下一张幻灯片)。
我已经调查..
- Using callbacks但随后它不会从出发到下一个幻灯片,这是顺便说一句硬编码的成功消息停止插件,所以当我们在等待Ajax响应向导已经转移到下一张幻灯片。
- 使用
async:false
,但这挂在浏览器像疯了(设计),直到请求完成,所以没有挂这正是我想要的。
我的代码如下所示。
JS。
jQuery('#progressWizard').bootstrapWizard({
'nextSelector': '.next',
'previousSelector': '.previous',
onNext: function (tab, navigation, index) {
if (index == 1) { // Here I am deciding which code to execute based on the current slide/tab (index)
if (jQuery("#paymentstep1").data('bValidator').validate()) {
var data = new FormData(jQuery('#paymentstep1')[0]);
jQuery("#cgloader").fadeIn();
var success = false;
jQuery.ajax({
type: "post",
async: false,
contentType: false,
processData: false,
url: "xyz.php",
dataType: "json",
data: data,
success: function (r) {
return r;
}
});
}....
第一种方法是唯一的真正可接受的解决方案。如果这意味着更改向导插件,我仍然强烈推荐它。使用'async:false'永远不会成为一种选择,因为如你所见,它会挂起浏览器直到请求完成。这会让浏览器看起来像是崩溃的用户,这是糟糕的用户体验。解决方法是使用异步请求。 –
停止导航到下一张幻灯片,然后在回调中重新启动它 –