[英]Execute an Ajax request when another one is finished
我循环遍历 Leaflet 地图中的标记层以捕获每个标记的纬度和经度,并使用 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 文档:
如果将单个参数传递给 jQuery.when() 并且它不是 Deferred 或 Promise,它将被视为已解决的 Deferred 并且任何附加的 doneCallbacks 将立即执行。
好的,多亏了这篇文章,我找到了解决方案: 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");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.