node.js 支持函数作为参数注册回调函数,彰显其支持异步处理特性

2017-12-10 16:09:27 +08:00
 Juggernaut
C 也同样支持函数可以作为参数注册回调,而且检查严格,node.js 根本不作检查,等运行就 crash·

有木有同感
4108 次点击
所在节点    Node.js
27 条回复
Juggernaut
2017-12-11 10:52:38 +08:00
@wwqgtxx C 函数因为是编译期间就确定好的,执行的过程中也就涉及到堆栈的申请 /销毁; JS 可以在运行的过程中动态的创建 /销毁函数,得益于 NODEJS 所有函数属于同一个对象,对吧?貌似理由不是很充分。。。
多谢
Juggernaut
2017-12-11 11:03:47 +08:00
@cctv1005s927 大概明白了非阻塞 API 的概念了,你说的 native api 其实就是 nodejs 提供的一些底层的 api,非阻塞其实就是调用不阻塞,执行是否阻塞(是否同步返回执行结果)要看具体功能了,这样理解对吧?

一个新问题,如果一个 http 请求触发一个非阻塞的耗时的 api 调用,在 http 请求超时之前都没能完成该原生 api 的执行,等到其执行完成后,回调函数被调用执行,但是 HTTP 请求已经超时,这中非阻塞还有意义吗?就是在阻塞的时间未知的情况下,要在规定的时间段内完成任务,这种矛盾如何解决~是我等菜鸟想的太多吗?

感谢
wwqgtxx
2017-12-11 11:27:33 +08:00
@Juggernaut 你可以把 js 中的每个函数都理解成 c++中的一个类的实例,每一个 function 都是运行时 new 出来的
至于你说的超时问题,所有异步 api 一般都会提供 timeout 设置,超时的时候会调用特殊的超时回调函数或者给普通回调函数传一个错误信息标识,另外异步操作也是可以被打断的呀,你在主线程设置一个定时器,超时了直接中断那个异步操作不就得了
Juggernaut
2017-12-11 11:38:38 +08:00
@wwqgtxx 感谢,在 NODEJS 架构中,如果 JS 调用阻塞的 native api,譬如文件读写,是不是常规做法是启动新的线程来做文件读写的工作?
wwqgtxx
2017-12-11 11:44:10 +08:00
@Juggernaut 在写 node 的时候,这不是你该考虑的问题,就比如你写 c 的时候不需要考虑 fwrite 是如何调用系统内核的 sys_write 函数,内核又是怎么寻道然后把数据通过 dma 发给硬盘,硬盘又是怎么写入到磁粉上的

node 的世界中最大特点是不提供任何阻塞 api,记住 node 永远是单线程的,至于它底层是怎么实现的,不是你该关心的
sensui7
2017-12-11 19:43:15 +08:00
还以为 node 有什么新特性了呢? 现在讨论这个? 大清亡了?
Juggernaut
2017-12-12 14:42:12 +08:00
@sensui7 不好意思惊扰大神,菜鸟在学习中

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/413507

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX