Javascript`confirm()`先执行其他操作

时间:2013-06-30 15:23:16

标签: javascript jquery

我有一个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”应该在那里。为什么这样,我该如何解决?

2 个答案:

答案 0 :(得分:3)

您看到的问题是JavaScript是单线程的,confirm正在阻止。

据我所知,

console.log是一个异步请求,要求控制台记录某些内容。但是,在脚本完成之前,它无法发送该请求。同样适用于drawscreen,在脚本完成之前,屏幕实际上无法重绘。

尝试将if块封装在setTimeout(function() { ... },1);内,这样可以让浏览器有足够的时间记录响应并重新绘制屏幕,​​然后再回到confirm,而无需提供用户有时间做任何可能干扰正常操作的事情。

答案 1 :(得分:0)

确认警告都是流程阻止声明。它们会阻止两者之间的过程,并且在按下“确定”按钮之前不允许任何内容反映在屏幕上。