编写在Ajax请求前的jConfirm弹窗为何晚于Ajax调用执行
问题根因
- 你遇到的执行顺序异常本质是第三方弹窗的非阻塞异步特性和原生同步弹窗的差异导致的:浏览器原生
confirm是同步阻塞API,执行时会暂停JS主线程,直到用户操作后才返回布尔值、继续执行后续代码;但你用的jConfirm是第三方UI组件的异步实现,调用后不会等待用户点击,会立刻返回非布尔值(通常为undefined),后续的Ajax代码会直接同步执行。 - 你配置了Ajax的
async: true为异步请求,网络请求的IO操作不会占用JS主线程,主线程会先处理完同步代码后才会渲染弹窗DOM,最终就出现了Ajax请求完成后弹窗才弹出的现象。
修复方案
所有需要等用户确认后才执行的逻辑,必须放到jConfirm的回调函数中,不能写在jConfirm调用的外部,修改后的代码参考如下:
// 不同版本jConfirm的回调入参可能略有差异,可根据实际使用的组件版本调整 jConfirm("Would you like to send a confirmation email ?", function(isConfirm) { const sendEmail = isConfirm ? 'Y' : 'N'; // Ajax逻辑放到回调内部执行 imsHTTP.ajax({ type : "POST", url : url, data : params, async : true, dataType : "json", success : function(jdata,msg){ /* 原有业务逻辑 */ } }); })
内容的提问来源于stack exchange,提问作者Sandeep Kalepu
相关产品推荐
相关产品推荐

