【发布时间】:2022-02-12 00:56:45
【问题描述】:
我知道这可能以前被问过,但是在过去的 20 年里,我来自单线程语言,我真的很难掌握 node.js 的真正本质。相信我,我已经阅读了很多关于此的 SO 帖子、github 讨论和文章。
我想我理解每个函数都有它自己的线程类型的交易。但是,在某些情况下,我希望我的代码完全同步(一个接一个地触发一个函数)。
例如,我做了 3 个函数,它们似乎向我展示了节点的异步 i/o 是如何工作的:
function sleepA() {
setTimeout(() => {
console.log('sleep A')
}, 3000)
}
function sleepB() {
setTimeout(() => {
console.log('sleep B')
}, 2000)
}
function sleepC() {
setTimeout(() => {
console.log('sleep C')
}, 1000)
}
sleepA()
sleepB()
sleepC()
这会输出以下内容:
sleep C
sleep B
sleep A
好的,这是有道理的。节点同时触发所有功能,并且首先完成的功能会被记录到控制台。有点像看赛马。节点开枪,函数起飞,最快的获胜。
所以现在我将如何使这些同步,以便顺序始终为 A、B、C,而不管 setTimeout 数字如何?
我已经涉足bluebird 和util 节点库之类的东西,但我仍然有点困惑。我认为这种异步逻辑非常强大,尽管我无法真正掌握它。 php毁了我的心。
【问题讨论】:
-
@Teemu - 好吧,除非您明确使用诸如工作进程或子进程之类的东西。 :-) “明确地”是那里的关键词。
-
"我将如何使这些同步,以便顺序始终为 A、B、C" 你的意思是:我如何不启动 B 超时,直到超时结束?在 B 完成之前不启动 C?
-
@T.J.Crowder 是的。
-
JavaScript 是单线程语言
标签: javascript node.js