首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript事件循环。需要澄清

Javascript事件循环。需要澄清
EN

Stack Overflow用户
提问于 2015-07-04 04:59:21
回答 2查看 113关注 0票数 5

我读到:

http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/

有句话说:

执行的单个线程要求运行时执行一项操作,提供回调函数,然后继续执行其他操作。当操作完成后,一条消息将与所提供的回调函数一起排队。在将来的某个时候,该消息将被退出队列,并触发回调。

所以在我脑海中发生的一个例子是:

代码语言:javascript
复制
console.log("x")
someAjaxCall(function({
callbackcode
})
console.log("y")

问题:

1) someAjaxCall操作正确,回调代码是回调?

2)因此,基本上在调用someAjaxCall时,会有一条消息排队,该消息指向回调函数,对吗?在调用console.log("y")之后,还是当堆栈被清空时,消息会被排除队列,回调/回调代码会被触发吗?

下面有句话:

“调用方与响应的分离允许JavaScript运行时在等待异步操作完成并触发它们的回调时执行其他操作。”

3)运行时是什么?那是什么意思?我只是认为这意味着调用堆栈可以恢复执行,当它清空时.消息就可以排出队列了吗?

EN

回答 2

Stack Overflow用户

发布于 2015-07-04 05:09:46

Javascript运行时是执行所有Javascript代码的软件。这意味着当Javascript在等待AJAX调用的响应时,它可以运行其他东西。例如,你可以显示“请等.”在等待服务器执行冗长的数据库查询时,使用旋转器。当接收到响应时,将执行回调,它可以停止旋转器并显示数据。

票数 0
EN

Stack Overflow用户

发布于 2015-07-04 05:09:50

把JavaScript引擎想象成在幕后看上去像这样:

代码语言:javascript
复制
while(true) {
    var event = updateUIAndDoNetworkingStuffAndWaitForIncomingEvent();
    if(event.hasJavaScriptHandler) {
        event.runJavaScriptHandlerForEvent();
    }
}

在某种程度上,您的代码运行。您可以运行console.log("x"),运行someAjaxCall函数,然后运行console.log("y")。在内部,someAjaxCall可能正在修改一些您看不到的状态,这种状态告诉浏览器:“嘿,当您到达updateUIAndDoNetworkingStuffAndWaitForIncomingEvent时,作为您‘做网络工作’的一部分,也可以执行这个HTTP请求,并且在完成之后,触发一个事件”。作为记录的一部分,它存储回调函数。然后,过了几次循环,updateUIAndDoNetworkingStuffAndWaitForIncomingEvent看到HTTP或任何东西已经完成,它返回一个事件,说“嘿,刚才你让我做的那个HTTP请求--好吧,它完成了!”然后,它后面的代码注意到它存储了一个回调,并调用了这个回调,您的代码在传递给someAjaxCall的回调中恢复执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31217066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档