2 回答

TA贡献1860条经验 获得超8个赞
这是显而易见的,因为内部您正在调用Async AJAX,因此它将并行运行,并且显然将比脚本响应晚于脚本响应,因此脚本将首先执行,然后ajax响应将出现并生效。listevent()
要修复,您可以使用的是ajax方法。这将强制脚本等待 ajax 返回响应。但这不是一个好的做法。async:false
function listevent(year, month, day){
$.ajax({
type: "POST",
url: "{% url 'listevent' %}",
async:false, // added
data: {'year':year, 'month':month, 'day':day, 'csrfmiddlewaretoken': '{{ csrf_token }}'},
dataType: "json",
success: function(response){
$("#sidebar").attr('year', year);
$("#sidebar").attr('month', month);
$("#sidebar").attr('day', day);
events = JSON.parse(response.events)
var str = "<h4>"+year+"/"+month+"/"+day+"</h4><br>"
if(events.length > 0){
events.forEach(event => str += (event['fields']['start_time']+" - "+event['fields']['title']+"<br>"));
} else {
str += "No events currently."
}
$("#sidebar").html(str);
var btn = $("<button></button>").html("New event");
btn.click(function(){
makeEventClick(day);
});
$("#sidebar").append(btn);
},
error: function(request,status,error){
console.log(error);
},
});
}
因此,作为一种良好做法,您可以将下一行移动到 .listevent()
function listevent(year, month, day){
$.ajax({
type: "POST",
url: "{% url 'listevent' %}",
data: {'year':year, 'month':month, 'day':day, 'csrfmiddlewaretoken': '{{ csrf_token }}'},
dataType: "json",
success: function(response){
$("#sidebar").attr('year', year);
$("#sidebar").attr('month', month);
$("#sidebar").attr('day', day);
events = JSON.parse(response.events)
var str = "<h4>"+year+"/"+month+"/"+day+"</h4><br>"
if(events.length > 0){
events.forEach(event => str += (event['fields']['start_time']+" - "+event['fields']['title']+"<br>"));
} else {
str += "No events currently."
}
$("#sidebar").html(str);
var btn = $("<button></button>").html("New event");
btn.click(function(){
makeEventClick(day);
});
$("#sidebar").append(btn);
document.getElementById("sidebar").insertAdjacentHTML( 'afterbegin', "Create new event successful." ); // Added
},
error: function(request,status,error){
console.log(error);
},
});
}

TA贡献1836条经验 获得超4个赞
似乎是 AJAX 异步工作的情况。 已成功运行,但由于它的 AJAX 操作,代码不会等到收到响应,这是成功/失败回调的剩余部分。listevent
调用和AJAX调用开始,而不是等待它完成,它移动到下一行,即listevent
document.getElementById("sidebar").insertAdjacentHTML( 'afterbegin', "Create new event successful." );
因此,我的建议是在成功回调结束时移动此 n 侧。listevent
添加回答
举报