在javascript中阻止UI线程

时间:2016-07-07 11:38:50

标签: javascript blocking ui-thread asynccallback

此处的上下文是我检查设备的位置是打开还是关闭。如果它关闭,它会提供一个警告对话框以转到位置设置。单击Proceed按钮,将对successAlert函数(代码下方)进行回调。一旦它进入successAlert函数,就会有一个watcPosition调用,以便在用户打开位置设置时查找位置变化。如果是,则由于位置已更改,因此必须调用onSuccess函数以在地图上显示新位置。

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

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

2 个答案:

答案 0 :(得分:3)

你原来的问题是:

  

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

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

你可以在一些特定的情况下(例如在进行ajax调用时),但这样做是个坏主意,因为它至少锁定了浏览器选项卡的UI,导致用户体验不佳

  

当存在alert时,如上面的代码中那样调用回调函数,否则不调用回调。可能是什么原因?怎么解决这个问题?

不,无论如何都要调用回调(除非您从页面导航离开),唯一的问题是何时。您可能想要阅读How do I return the result of an asynchronous call?(剧透:您不要接受异步)。

答案 1 :(得分:0)

试试这个。

function blockThread(milliseconds) {
        const start = new Date().getTime();
        for (var i = 0; i < 1e7; i++) {
          if (new Date().getTime() - start > milliseconds) {
            break;
          }
        }
      }
    ```