在执行代码时setInterval()暂停

时间:2019-02-27 22:15:12

标签: javascript asynchronous setinterval

给我的印象是type Response events.APIGatewayProxyResponse var db *sql.DB func init() { var err error db, err = sql.Open("postgres", fmt.Sprintf( "host=%s port=%d user=%s dbname=%s password=%s", os.Getenv("DB_HOST"), os.Getenv("DB_PORT"), os.Getenv("DB_USER"), os.Getenv("DB_NAME"), os.Getenv("DB_PASS"), )) if err != nil { fmt.Printf("Database connection booboo") panic(err) } } 每隔setInterval(function, delay)毫秒安排一次呼叫function的时间。它将重复执行此操作,直到调用delay。但是,似乎我丢失了一些东西。

我有以下示例页面。目的很简单:每秒使文本从加载-> 加载。-> 加载.. 切换。这是按预期方式工作的循环示例:

clearInterval()
    $(document).ready(function(){
        $('#loading_icon').html("Loading");
        loop = setInterval(function() {
            updateText();
        }, 1000);
    });

    function updateText() {
        loadingText = $('#loading_icon').html();
        $('#loading_icon').html(loadingText == "Loading"  ? "Loading."  : 
                                loadingText == "Loading." ? "Loading.." : 
                                "Loading");
    }

什么都没有。问题是,只要JavaScript在做其他事情,它就不会执行此代码。我设置了以下示例:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="loading_icon">Loading</div>
    $(document).ready(function(){
        $('#loading_icon').html("Loading");
        loop = setInterval(function() {
            updateText();
        }, 1000);

        for(i = 0; i < 100000; i++)
           var a = fib(i);  // Just an arbitrary method to simulate work
    });

    function fib(n){
        var a=1,b=0,t;while(n>=0){t=a;a=a+b;b=t;n--;}return b;
    }

    function updateText() {
        loadingText = $('#loading_icon').html();
        $('#loading_icon').html(loadingText == "Loading"  ? "Loading."  : 
                                loadingText == "Loading." ? "Loading.." : 
                                "Loading");
    }

理想情况下,当我们执行所有这些工作时,文本会发生变化(毕竟,这就是我编写此“加载”功能的全部原因)。但是,似乎没有任何对<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="loading_icon">Loading</div>的调用被调用,直到JS没有更好的事情要做。

我在这里想念什么?有什么办法可以实现我的追求吗?

2 个答案:

答案 0 :(得分:0)

是的,它仍然有效-问题是您在fib上的循环首先运行,然后在setInterval上运行。您可以减小循环长度以使其工作正常:

$(document).ready(function() {
  $('#loading_icon').html("Loading");
  loop = setInterval(function() {
    updateText();
  }, 1000);

  for (i = 0; i < 100000; i++)
    var a = fib(i); // Just an arbitrary method to simulate work
});

function fib(n) {
  var a = 1,
    b = 0,
    t;
  while (n >= 0) {
    t = a;
    a = a + b;
    b = t;
    n--;
  }
  return b;
}

function updateText() {
  loadingText = $('#loading_icon').html();
  $('#loading_icon').html(loadingText == "Loading" ? "Loading." :
    loadingText == "Loading." ? "Loading.." :
    "Loading");
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="loading_icon">Loading</div>

不幸的是,您不能做一个非常长的循环,而setInterval不能同时运行。

答案 1 :(得分:0)

您对setInterval()的理解似乎是正确的。它不应在其回调函数之外暂停代码。您的代码很可能被其他地方捕获。

对于完成您想做的事情,您的解决方案应该可以工作,但这不是操纵DOM的一种非常优雅的方法。我看到您使用的是jQuery,它的功能非常强大animation functionality。我会考虑使用这样的东西。