我有一个javascript代码,在AJAX调用完成后执行。
req.done(function (response, textStatus, jqXHR){
if (response == " ok"){
// values are confirmed
this.s = this._s
this.e = this._e
this.assign = this._assign
this.y = roomline.snapHeight(this.assign);
console.log(response)
drawscreen()
if (confirm('Would you also like to apply a discount/credit?')){
var link = "?some_get_request"
self.location = "assignDiscount.php" + link;
}
} else {
alert(response)
}
});
正如您所看到的,我有一堆在confirm()
对话框显示之前应该发生的事情(例如drawscreen()
或console.log
)。
问题是这些东西都没有发生在之前确认对话框,但刚刚发生!我应该在我的javascript控制台中看到“ok”:相反,我在确认对话框上按“取消”按钮后看到它。这没有任何意义:当我看到弹出对话框时,“ok”应该在那里。为什么这样,我该如何解决?
答案 0 :(得分:3)
您看到的问题是JavaScript是单线程的,confirm
正在阻止。
console.log
是一个异步请求,要求控制台记录某些内容。但是,在脚本完成之前,它无法发送该请求。同样适用于drawscreen
,在脚本完成之前,屏幕实际上无法重绘。
尝试将if
块封装在setTimeout(function() { ... },1);
内,这样可以让浏览器有足够的时间记录响应并重新绘制屏幕,然后再回到confirm
,而无需提供用户有时间做任何可能干扰正常操作的事情。
答案 1 :(得分:0)
确认和警告都是流程阻止声明。它们会阻止两者之间的过程,并且在按下“确定”按钮之前不允许任何内容反映在屏幕上。