我循环遍历Leaflet地图中的标记图层,以捕获每个标记的纬度和经度,并使用Ajax在我的数据库中发送此坐标。
然后,当我在我的数据库中发送每个标记的纬度和经度时,我想用另一个Ajax调用我的WFS层来显示添加到我的数据库的新标记。
为此,我想在第一个完成后调用我的第二个Ajax,所以我尝试使用$ .when()。done(),但它不起作用。
如果我发送几个标记的坐标,它可以工作,但是如果我尝试发送200个标记,则第二个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");
编辑:
这是我使用deffered对象的最佳尝试,但它不起作用......
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");
答案 0 :(得分:1)
看起来您的layer.eachLayer
函数未返回Promise / Deferred。沿着jQuery doc:
如果将单个参数传递给jQuery.when()并且它不是 延期或承诺,它将被视为已解决的延期和 附加的任何doneCallbacks将立即执行。
答案 1 :(得分:1)
好的,所以我通过这篇文章找到了解决方案: jquery deferred in .each loop
这是我后代的最终代码;-):
var dialog_create = $('#dialog_create').dialog();
dialog_create.dialog(options, {
buttons: {
Add: function() {
function getAjaxDeffered(){
var promises = [];
layer.eachLayer(function(layer) {
var def = new $.Deferred ();
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() {
def.resolve();
dialog_create_EP.dialog("close");
$("#formulaireEP")[0].reset();
}
})
promises.push(def)
})
return $.when.apply(undefined, promises).promise();
}
defer.resolve(getAjaxDeffered());
getAjaxDeffered().then(function(data) {
$.ajax({
url: owsrootUrlAssainissement + L.Util.getParamString(parametersEP),
dataType: 'jsonp',
jsonpCallback: 'callEP'
}).done(EPvannes1);
});
return false;
},
Cancel: function() {
dialog_create_EP.dialog("close");
},
}
});
dialog_create_EP.dialog("open");