Javascript事件循环。澄清需要

时间:2015-07-04 04:59:21

标签: javascript

我正在读这个:

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)什么是运行时?那是什么意思?我只是认为callstack可以恢复执行,当它清空时...然后消息可以出列?

2 个答案:

答案 0 :(得分:0)

Javascript运行时是执行所有Javascript代码的软件。这意味着当Javascript正在等待对AJAX调用的响应时,它可以运行其他东西。例如,您可以显示"请稍候......"在等待服务器执行冗长的数据库查询时使用微调器。收到响应后,将执行回调,并且可以停止微调器并显示数据。

答案 1 :(得分: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的回调中继续执行。