如何在Node.js中解释和执行异步javascript?
最近我对Node.js的核心做了很多研究,我对Node平台的内部工作有一些疑问。据我所知,Node.js的工作原理如下: Node有一个用Javascript编写的API,它允许程序员与文件系统和网络之类的东西进行交互。然而,所有这些功能实际上都是由C/C++代码完成的,也是节点的一部分。这就是事情变得有点模糊的地方。因此,ChromeV8引擎的工作就是将javascript“编译”(解释?)成机器代码。V8是用C++编写的,JavaScript语言本身是由ECMA指定的,所以这些关键字和语言的特征都是由它们定义的。这就引出了我的前几个问题:如何在Node.js中解释和执行异步javascript?,javascript,c++,node.js,v8,libuv,Javascript,C++,Node.js,V8,Libuv,最近我对Node.js的核心做了很多研究,我对Node平台的内部工作有一些疑问。据我所知,Node.js的工作原理如下: Node有一个用Javascript编写的API,它允许程序员与文件系统和网络之类的东西进行交互。然而,所有这些功能实际上都是由C/C++代码完成的,也是节点的一部分。这就是事情变得有点模糊的地方。因此,ChromeV8引擎的工作就是将javascript“编译”(解释?)成机器代码。V8是用C++编写的,JavaScript语言本身是由ECMA指定的,所以这些关键字和语言
request(..., function eyeOfTheTiger() {
console.log("Rising up to the challenge of our rival");
});
我们对request
的调用被推到调用堆栈上,我们的回调被传递到某个地方,在那里它一直保持到请求操作完成。当它这样做时,回调被传递到回调队列。每次清除调用堆栈时,事件循环都会将回调队列顶部的项推送到调用堆栈上,并在那里执行。此事件循环在单个线程上运行。出现问题的地方是当有人编写“阻塞”代码时,或者代码永远不会离开调用堆栈并有效地绑定线程。如果总是有代码在调用堆栈上执行,那么事件循环将永远不会将项目从回调队列推送到调用堆栈上,它们也永远不会被执行,本质上冻结了应用程序。这就引出了我的下一个问题:
状态更新:刚刚在Sencha会议上观看了一场精彩的演讲()。因此,在这个演讲中,演示者提到了V8嵌入的引导(),并讨论了C++函数如何暴露给JavaScript,反之亦然。它的工作原理是,C++函数可以被暴露到V8,也可以指定它希望如何将这些对象暴露给JavaScript,并且V8解释器能够识别出嵌入的C++函数并在找到与您指定的匹配的JavaScript时执行它们。例如,您可以将变量和函数公开给V8,而这些V8实际上是用C++编写的。这就是Node.js的基本功能;它可以在调用JC++脚本时添加诸如<代码>要求/CODE的函数,这些代码实际上在调用C++代码时执行。这稍微澄清了问题1,但并没有确切说明节点标准库如何与V8配合使用。关于libuv是如何与这些相互作用的,目前还不清楚。基本上,你要寻找的是。它将所有C++代码公开为可以从V8虚拟机中调用的JavaScript函数。当调用函数或访问特定对象属性时,可以将C++回调关联(读<强> < /强>和<强> < /强>)。< /P> 我发现一篇很好的文章解释了这一切-。它还解释了libuv如何与Node一起工作以实现异步性
希望这有帮助 试图回答你的问题,我相信你在寻找的是这个-。它基本上将所有C++代码公开为可以从V8 VM调用的JavaScript函数。您可以使用称为“访问器”回调的东西定义C++回调。每当代码访问对象的特定属性时,就会调用它。有一篇非常好的文章解释了所有这些——非常棒的资源。你想写一个正式的答复来获得赏金吗?当然。我还没试过做什么