在javascript中阻止UI线程

在javascript中阻止UI线程,javascript,blocking,ui-thread,asynccallback,Javascript,Blocking,Ui Thread,Asynccallback,这里的上下文是我检查设备的位置是打开还是关闭。如果禁用,则会显示一个警报对话框,以转到位置设置。单击“继续”按钮后,将回调successAlert函数(下面的代码)。一旦它进入successAlert函数,就会调用一个watcPosition来查找位置的变化,如果用户已经打开了位置设置。如果是,则由于位置已更改,必须调用onSuccess函数在地图上显示新位置 function successAlert(msg) { alert("inside successAlert"); w

这里的上下文是我检查设备的位置是打开还是关闭。如果禁用,则会显示一个警报对话框,以转到位置设置。单击“继续”按钮后,将回调successAlert函数(下面的代码)。一旦它进入successAlert函数,就会调用一个watcPosition来查找位置的变化,如果用户已经打开了位置设置。如果是,则由于位置已更改,必须调用onSuccess函数在地图上显示新位置

function successAlert(msg) { 
   alert("inside successAlert"); 
   watchId = navigator.geolocation.watchPosition(onSuccess); 
} 

这是代码。在异步回调时调用successAlert函数,然后启动watchPosition计时器以查找设备位置的变化。若位置有任何变化,它应该调用onSuccess回调函数。当出现警报时,会调用回调函数,就像上面的代码一样,不会调用回调函数。原因可能是什么?如何解决这个问题?

您最初的问题是:

如何阻止javascript中等待异步函数调用成功或错误函数的UI线程

在一般情况下,你不能;如果您尝试这样做,不仅会阻止回调被调用,而且最终浏览器会放弃您的代码并终止它

在某些特定情况下(例如在进行ajax调用时),您可以这样做,但这样做是一个坏主意,因为它至少会锁定浏览器选项卡的UI,从而导致糟糕的UX

当出现
警报时,调用回调函数,就像上面的代码一样,不调用回调函数。原因可能是什么?如何解决这个问题

否,回调将被调用(除非您离开页面),唯一的问题是何时。你可能想通读一遍(破坏者:你没有,你接受异步)。

试试这个

函数块线程(毫秒){
const start=new Date().getTime();
对于(变量i=0;i<1e7;i++){
如果(新日期().getTime()-start>毫秒){
打破
}
}
}
```

我假设您要阻止的不是线程(提示:您不能),而是在某些操作完成之前禁用UI?请参阅使用同步阻止进程。函数successAlert(msg){alert(“inside successAlert”);watchId=navigator.geolocation.watchPosition(onSuccess);}这是代码。在异步回调时调用successAlert函数,然后启动watchPosition计时器以查找设备位置的变化。若位置有任何变化,它应该调用onSuccess回调函数。当出现警报时,会调用回调函数,就像上面的代码一样,不会调用回调函数。原因可能是什么?如何解决?您需要解决的实际问题是什么?如果我删除警报,则不会调用onSuccess回调函数。我不希望警报函数存在。替代方法包括,在适当的按钮上设置
disabled=true
,添加
onbeforeundload=function(){return'警告:正在保存,如果您现在离开,数据可能会丢失!';}
等等。