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()后立即看到加载程序
现在我想知道的是:
doSubmitSuccessOperations()
在后台运行doSubmitSuccessOperations()
正在阻止UI操作,JS中是否有UI线程和后台线程的概念setTimeout
还有其他选择吗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()
}