尽管我是研究关于JavaScript的异步行为被单线程和我的注释说明后传来,此代码:的Javascript同步和异步流程优先
request(..., function (error, response, body)
console.log('foo);
});
callAComputationallyIntensiveSynchronousFunctionThatTakesSixHoursToExecute();
console.log('bar');
“酒吧”依然会前“ foo',因为Javascript总是先完成当前正在执行的函数。事件永远不会中断函数。
我知道一个同步函数执行比事件具有更高的优先级,但我不明白为什么'bar'会在'foo'之前打印。从我的阅读中,应该进行异步调用,然后在响应准备好之前填充死区时间,然后继续并处理其他代码行直到准备就绪,然后应执行响应的回调函数之后返回到处理代码等等。
上面的例子说明,即使响应在同步函数执行结束很久之前就准备好了,它仍然继续并执行下一行代码。这是为什么?
感谢您的回答,但我认为您可能会误解代码中的某些内容,但我不确定。'console.log('bar')'遵循computationalHeavyFunction,它不是函数的作用。根据你的说法,我明白在完成'同步'功能后,应该看看队列,看看请求正在等待执行,因为解析器没有到达console.log('bar' )指令将其添加到队列中。此外,运行时如何决定队列中的哪个函数选择下一个? – Andu
不完全。例如,_ajax call_实际上是异步的,它在它自己的线程中运行。与此同时,浏览器继续原始脚本,并最终将控件移动到用户(和事件队列)。当ajax线程准备就绪时,会执行JS回调函数,它为浏览器保留“唯一”线程。 – Teemu
在与一些同事讨论这个问题之后,我想我已经完全理解了这是如何工作的。脚本是它们的函数,它们是第一个被添加到队列中的,然后它开始执行并向队列中添加新的“异步”函数,同时继续执行剩余的函数。只有当机器完成执行当前队列功能(在本例中为脚本本身)之后,它才会按照我的假设查看队列并决定下一个要执行的功能(可能是请求回调或其他脚本),而不是在每个函数调用之后执行。 – Andu