jquery-函数中同步ajax和dialogbox的问题
我无法将使用AJAX获得的函数结果与该函数同步。 我的想法是发送AJAX请求,然后在收到应答后打开对话框,在用户确认函数返回正确的值之后。问题是,即使我将ajax请求设置为非异步,我的函数也不会等待响应并在捕获用户操作之前返回值。 下面是一个代码:jquery-函数中同步ajax和dialogbox的问题,jquery,ajax,jquery-ui,jquery-ui-dialog,Jquery,Ajax,Jquery Ui,Jquery Ui Dialog,我无法将使用AJAX获得的函数结果与该函数同步。 我的想法是发送AJAX请求,然后在收到应答后打开对话框,在用户确认函数返回正确的值之后。问题是,即使我将ajax请求设置为非异步,我的函数也不会等待响应并在捕获用户操作之前返回值。 下面是一个代码: checkColisions = function(event) { var parsedStart = Date.parse(event.start); var parsedEnd = Date.parse(even
checkColisions = function(event) {
var parsedStart = Date.parse(event.start);
var parsedEnd = Date.parse(event.end);
var returnValue = true;
returnValue = $.ajax({
async: false,
url: '<?php echo url_for('lecture/ajaxCheckColisions')?>',
data: ({id: event.eid, name:event.title, start: parsedStart, end: parsedEnd}),
success: function(data) {
if(data == 'no-colisions')
{
returnValue = false; //do nothing
}
else
{
$("#dialog-colisions").dialog({
resizable: false,
open: function() {
$('#dialog-colisions').text()
$('#dialog-colisions').append('<p>Found colisions:</p>');
$('#dialog-colisions').append(data);
},
height:300,
modal: true,
buttons: {
'Continue': function(){
$(this).dialog('close');
returnValue = false;
},
'Cancel': function() {
$(this).dialog('close');
returnValue = true;
}
}
});
}
},
error: function(data) {
alert('error' +data);
}
});
return returnValue;
};
enter code here
returnValue应该由dialogbox设置,但不是。
你知道吗?你不应该试图阻止浏览器中的线程。更好的解决方案是打开对话框并从jquery提供给您的回调中触发适当的操作 你现在有点像
var returnValue= checkColisions(e);//go to server and open a popup
if(returnValue==true){
doCollistionStuff();
}else{
noCollitionDetected();
}
我的建议是将对话框更改为如下内容:
$("#dialog-colisions").dialog({
resizable: false,
open: function() {
$('#dialog-colisions').text()
$('#dialog-colisions').append('<p>Found colisions:</p>');
$('#dialog-colisions').append(data);
},
height:300,
modal: true,
buttons: {
'Continue': function(){
doCollistionStuff();
},
'Cancel': function() {
noCollitionDetected();
}
}
});
谢谢你的建议,但在我的例子中,我似乎不得不像在你的第一段代码中那样使用它,因为这个主函数checkColisions是由FullCalendar的几个不同函数调用的,比如drop,eventDrop和eventClick,它们中的每一个都会产生其他冲突。我的意思是,函数checkcolions在代码的几个不同部分中使用,并且每个部分在得到结果后都会做一些不同的事情。因此,我们不可能在Continue按钮函数中执行操作,因为它的主体依赖于称为checkCollisions函数的代码部分。就像现在这样返回值似乎很好,并允许代码的这一部分决定如何处理结果,就像在您的代码中:var returnValue=checkColisionse;ifreturnValue==true{docollistionstaff;}否则{nocollisiondetected;}