暂停函数执行流程,直到ajax请求完成
Pause the function execution flow till ajax request completes
我似乎遇到了典型的"异步问题",解决方案让我措手不及。
我有一个引导表单向导,它只是一个即兴的选项卡/幻灯片之类的东西。我所有的"步骤"都是在各自的选项卡/幻灯片中形成的。
它有一组下一个/上一个按钮,用于在幻灯片中导航。在移动到下一张幻灯片之前,它在上提供了函数回调。在其中(回调),我正在"客户端验证"当前幻灯片中的表单,如果已验证,则我将使用ajax提交表单。一旦我从服务器得到响应,我就决定是返回true(继续到下一张幻灯片)还是返回false(停止导航到下一个幻灯片)。
我已经调查过了。。
- 使用回调,但它不会阻止插件继续到下一张幻灯片,btw是一个硬编码的成功消息,所以当我们等待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;
}
});
}....
onNext
的文档说:
单击下一个按钮时激发(返回false禁用进入下一步)
因此,只需从处理程序返回false
即可。在AJAX成功回调中,调用next
进入下一张幻灯片。
var requestCompleted = false;
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()) {
if(!requestCompleted) {
var data = new FormData(jQuery('#paymentstep1')[0]);
jQuery("#cgloader").fadeIn();
var success = false;
jQuery.ajax({
type: "post",
url: "xyz.php",
data: data,
// ...
success: function (r) {
requestCompleted = true;
jQuery('#progressWizard').bootstrapWizard('next');
return r;
}
});
return false;
}
}
}
});
使用promise?
jQuery中有一个承诺。这是语法。
$.when( $.ajax( "test.aspx" ) ).then(function( data, textStatus, jqXHR ) {
alert( jqXHR.status ); });
现在javascript中也有promise!
var promise = new RSVP.Promise(function(fulfill, reject) {
(...)
});
然后,
promise.then(onFulfilled, onRejected);
我会使用不同的事件来执行异步代码。这个想法是使用onTabChange
(考虑使用onTabClick
和onTabShow
),这样就可以防止移动到bootstrapWizard();
导航的下一个选项卡。只有在一切通过后,才能以编程方式启动下一个选项卡,您必须了解如何启动。
$('element').bootstrapWizard('onTabShow', function(){
//Do everything you need here and show next tab
$('element').bootstrapWizard('show',3);
return false;
});
相关文章:
- ajax请求的顺序总是不同的
- 从ajax请求中获取javascript对象
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- JavaScript代码未正确检查ajax请求
- "日期“;AJAX请求返回的类型值未定义
- 在等待ajax请求时显示微调器并禁用页面
- 跨域ajax请求
- Ajax请求返回空的数据字符串,但首先得到了正确的数据
- Javascript-如何让脚本与Ajax请求的数据一起运行
- ajax请求成功,但可以'我看不到我的数据
- 如何将给定的curl命令复制为jquery ajax请求
- 为什么我能够从javascript控制台发送跨域ajax请求
- 一台特定计算机的Ajax请求数据未定义/失败
- 获取ajax请求的请求头
- 原型Ajax请求参数为嵌套json
- 可以't从AJAX请求中筛选数据
- jQuery Mobile Collapse上的AJAX请求
- 暂停函数执行流程,直到ajax请求完成