Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
setTimeout与Javascript中的正常函数执行_Javascript_Jquery_Asynchronous_Javascript Objects_Dom Events - Fatal编程技术网

setTimeout与Javascript中的正常函数执行

setTimeout与Javascript中的正常函数执行,javascript,jquery,asynchronous,javascript-objects,dom-events,Javascript,Jquery,Asynchronous,Javascript Objects,Dom Events,在我的应用程序中,我有一个submitSuccesscallback函数,当提交成功时,它将从我自己的JS库中触发。 在submitSuccesscallback中,我首先显示一个加载程序并执行一些初始化操作 function submitSuccesscallback(){ showLoadingIndicator(); // has code a display loader doSubmitSuccessOperations();// has code to do some app

在我的应用程序中,我有一个
submitSuccesscallback
函数,当提交成功时,它将从我自己的JS库中触发。 在
submitSuccesscallback
中,我首先显示一个加载程序并执行一些初始化操作

function submitSuccesscallback(){
  showLoadingIndicator(); // has code a display loader
  doSubmitSuccessOperations();// has code to do some app specific operations
}
这里的
doSubmitSuccessOperations()
大约需要5秒才能完成执行

现在我的问题是,在我获得
submitSuccesscallback()
后,上面的代码最多5秒都不会显示加载程序(即ui从
showLoadingIndicator()
更改)

如果我像下面这样更改submitSuccesscallback(),我可以在触发submitSuccesscallback()后立即看到加载程序

现在我想知道的是:

  • setTimeout是否使我的
    doSubmitSuccessOperations()
    在后台运行

  • 我清楚地感觉到
    doSubmitSuccessOperations()
    正在阻止UI操作,JS中是否有UI线程和后台线程的概念

  • 上面的
    setTimeout
    还有其他选择吗

  • setTimeout是否使doSubmitSuccessOperations()在后台运行

    不,JS是单线程的。代码和呈现在同一线程中。这就是为什么长时间运行的操作会阻止渲染

    setTimeout
    所做的是将该操作放在一边,直到引擎能够执行它(它不会停止运行代码),并且至少(不是完全)在您指定的延迟之后。之后的代码正常执行,就好像它是线程中的下一个操作一样。这意味着
    setTimeout
    中的代码已经与代码中出现的顺序不同

    我清楚地感觉到doSubmitSuccessOperations()正在阻止UI操作,JS中是否有UI线程和后台线程的概念

    以上设置超时还有其他选择吗

    异步编程就是其中之一,定时器(
    setTimeout
    和friends)是最可用的。在其他环境中,IE具有
    setImmediate
    ,节点具有
    process.nextTick
    。还有WebWorkers,它们更接近真实的线程。如果您有一台服务器,您可以使用AJAX(这也是异步操作的一种形式)来调用服务器并让它为您执行操作

    。视频中间的某个地方解释。

    setTimeout是否使doSubmitSuccessOperations()在后台运行

    不,JS是单线程的。代码和呈现在同一线程中。这就是为什么长时间运行的操作会阻止渲染

    setTimeout
    所做的是将该操作放在一边,直到引擎能够执行它(它不会停止运行代码),并且至少(不是完全)在您指定的延迟之后。之后的代码正常执行,就好像它是线程中的下一个操作一样。这意味着
    setTimeout
    中的代码已经与代码中出现的顺序不同

    我清楚地感觉到doSubmitSuccessOperations()正在阻止UI操作,JS中是否有UI线程和后台线程的概念

    以上设置超时还有其他选择吗

    异步编程就是其中之一,定时器(
    setTimeout
    和friends)是最可用的。在其他环境中,IE具有
    setImmediate
    ,节点具有
    process.nextTick
    。还有WebWorkers,它们更接近真实的线程。如果您有一台服务器,您可以使用AJAX(这也是异步操作的一种形式)来调用服务器并让它为您执行操作

    。在视频中间的某个地方解释。

    < P > 1)StimeTimeT是否使我的Buffube成功操作()在后台运行?没有

    2) 我清楚地感觉到doSubmitSuccessOperations()正在阻止UI操作,JS中是否有UI线程和后台线程的概念没有

    3) 以上设置超时是否有其他选择?-您可以尝试将0放入超时,这样引擎将尝试在第一个可用位置执行函数。

    1)setTimeout是否使my doSubmitSuccessOperations()在后台运行?-没有

    2) 我清楚地感觉到doSubmitSuccessOperations()正在阻止UI操作,JS中是否有UI线程和后台线程的概念没有


    3) 以上设置超时是否有其他选择?-您可以尝试将0放入超时,这样引擎将尝试在第一个可用位置执行函数。

    基本上,您有一个JavaScript引擎正在浏览器中运行代码。这个引擎有一个调用堆栈。它是您排队等待执行的所有函数的堆栈。还有一种称为事件循环的东西,它是一个队列,包含作为某个事件的副作用而在那里排队的函数。当调用堆栈为空时,放在事件循环顶部的函数将被推入调用堆栈并执行。此调用堆栈位于UI线程的“内部”

    调用setTimeout时(doSubmitSuccessOperations,1000);doSubmitSuccessOperations在执行这行代码后1秒添加到事件循环中。当执行所有UI逻辑(显示微调器、移动文本、动画等)时,调用堆栈将为空。然后doSubmitSuccessOperations将从事件循环中弹出,并推送到调用堆栈中。这是函数执行的时间

    因此,不,setTimeout不会使doSubmitSuccessOperations在后台运行。它只是让它按照您的UI逻辑运行


    后台线程有一个概念,称为服务工作者。但是你不能在它里面做UI操作。

    基本上,你有一个JavaScript引擎在浏览器中运行你的代码。这个引擎有一个调用堆栈。它是您排队等待执行的所有函数的堆栈。还有一种称为事件循环的东西,它是一个队列,包含作为某个事件的副作用而在那里排队的函数。电话什么时候打
     function submitSuccesscallback(){
      showLoadingIndicator(); // has code a display loader
      setTimeout(doSubmitSuccessOperations, 1000);
    }
    
    function submitSuccesscallback(){
        showLoadingIndicator(); // has code a display loader
        doSubmitSuccessOperations();// has code to do some app specific operations
      }
    
    submitSuccesscallback(function(){
      showLoadingIndicator(function(){
      doSubmitSuccessOperations()
      })
    })
    
    function showLoadingIndicator(callback){
    // your code to display loading image
     $('loadingimage').show(0,'', function(){
        callback();
    });
    
    }
    
    function submitSuccesscallback(callback){
        // your code must be sync here 
        // if asynchrony than call callback in .success function
    
       //at last(if no asyn operation)
       callback()
    
      }