JavaScript事件循环。需要澄清。

5
我正在阅读这篇文章:http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/,其中有这样一句话:“执行单线程请求运行时执行操作,提供回调函数并继续执行其他任务。当操作完成后,该操作会被放在消息队列中,同时也会携带回调函数。在将来的某个时间点,消息将被取出并执行相应的回调函数。”我的理解是:这里发生了什么事情的一个例子如下:
console.log("x")
someAjaxCall(function({
callbackcode
})
console.log("y")

问题:
1)someAjaxCall是正确的操作,callbackcode是回调函数吗?
2)基本上当调用someAjaxCall时,会排队一个指向回调函数的消息,对吗?在调用console.log("y")或堆栈被清空后,消息将被出列并触发回调/回调代码?

然后有这句话:

"调用方与响应之间的解耦允许JavaScript运行时在等待异步操作完成和它们的回调触发时做其他事情。"

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

这个问题的答案JavaScript如何在后台处理AJAX响应?可能已经回答了你大部分的问题。这个问题甚至可能是那个问题的重复。 - jfriend00
2个回答

0

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


0

把 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的回调函数内继续执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接