我循环遍历 Leaflet map 中的标记层以捕获每个标记的纬度和经度,并使用 Ajax 将此坐标发送到我的数据库中。
然后,当我发送了数据库中每个标记的纬度和经度后,我想用另一个 Ajax 调用我的 WFS 层以显示添加到我的数据库中的新标记。
为此,我想在第一个 Ajax 完成后调用我的第二个 Ajax,所以我尝试使用 $.when().done(),但它不起作用。
如果我发送几个标记的坐标,它会起作用,但如果我尝试发送 200 个标记,则第二个 Ajax 会在第一个 Ajax 结束之前执行,并且不会显示我的 WFS 层。如果我在第二个 Ajax 上设置超时以给第一个 Ajax 执行时间,它会起作用,但这不是解决方案。
这是我的代码:
var dialog_create = $('#dialog_create').dialog();
dialog_create.dialog(options, {
buttons: {
Add: function() {
$.when(
layer.eachLayer(function(layer) {
latGPS = layer.getLatLng().lat;
lngGPS = layer.getLatLng().lng;
$('#latitudeEP').val(latGPS);
$('#longitudeEP').val(lngGPS);
data = $("#formulaireEP").serialize();
$.ajax({
url: 'assets/php/create/create_EP.php',
type: $("#formulaireEP").attr('method'),
data: data,
success: function() {
dialog_create_EP.dialog("close");
$("#formulaireEP")[0].reset();
}
})
})
).done(function(data) {
//setTimeout(function(){
$.ajax({
url: owsrootUrlAssainissement + L.Util.getParamString(parametersEP),
dataType: 'jsonp',
jsonpCallback: 'callEP'
}).done(EPvannes1);
//},5000);
});
return false;
},
Cancel: function() {
dialog_create_EP.dialog("close");
},
}
});
dialog_create_EP.dialog("open");
编辑:
这是我使用延迟对象的最佳尝试,但它不起作用...
var dialog_create = $('#dialog_create').dialog();
dialog_create.dialog(options, {
buttons: {
Add: function() {
var defer = $.Deferred();
function getAjaxDeffered(){
layer.eachLayer(function(layer) {
latGPS = layer.getLatLng().lat;
lngGPS = layer.getLatLng().lng;
$('#latitudeEP').val(latGPS);
$('#longitudeEP').val(lngGPS);
data = $("#formulaireEP").serialize();
$.ajax({
url: 'assets/php/create/create_EP.php',
type: $("#formulaireEP").attr('method'),
data: data,
success: function() {
dialog_create_EP.dialog("close");
$("#formulaireEP")[0].reset();
}
})
})
}
defer.resolve(getAjaxDeffered());
$.when(defer).then(function(data) {
//setTimeout(function(){
$.ajax({
url: owsrootUrlAssainissement + L.Util.getParamString(parametersEP),
dataType: 'jsonp',
jsonpCallback: 'callEP'
}).done(EPvannes1);
//},5000);
});
return false;
},
Cancel: function() {
dialog_create_EP.dialog("close");
},
}
});
dialog_create_EP.dialog("open");
最佳答案
看起来您的 layer.eachLayer
函数没有返回 Promise/Deferred。沿着 jQuery 文档:
If a single argument is passed to jQuery.when() and it is not a Deferred or a Promise, it will be treated as a resolved Deferred and any doneCallbacks attached will be executed immediately.
关于javascript - 当另一个请求完成时执行一个 Ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39869697/