我有一个在 AJAX 调用完成后执行的 javascript 代码。
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 控制台中看到“确定”:相反,我在按下确认对话框上的“取消”按钮后看到它。这没有任何意义:当我看到弹出对话框时,“确定”应该在那里。为什么会这样,我该如何解决?
最佳答案
您看到的问题是 JavaScript 是单线程的,confirm
是阻塞的。
console.log
,据我所知,是对控制台进行日志记录的异步请求。但是,在脚本完成之前,它无法发送该请求。 drawscreen
也是如此,在脚本完成之前,屏幕实际上无法重绘。
尝试将您的 if
block 包装在 setTimeout(function() { ... },1);
中,这将为浏览器提供足够的时间来记录响应并在立即返回您的确认
之前重绘屏幕,不给用户时间做任何可能干扰正常操作的事情。
关于Javascript `confirm()` 先执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17391902/