我想更好地了解 nodejs 在什么條件下停止正在運行的行程。我的猜測是,當堆疊和事件回圈都為空時,它會停止該程序。但是下面的程式只列印hello一次,而我希望它永遠回圈,每秒列印hello一次。
(async () => {
while (true) {
await new Promise(resolve => setTimeout(() => console.log("hello"), 1000))
}
})();
回圈如何while (true)與事件回圈互動?
uj5u.com熱心網友回復:
您沒有弄錯 NodeJS 的作業原理。您的代碼只是有一個錯誤:resolve永遠不會被呼叫。
如果將其更改為以下內容,"hello"則以 1 秒的間隔永久列印:
(async () => {
while (true) {
await new Promise(resolve => setTimeout(() => {
console.log("hello")
resolve();
}, 1000))
}
})();
您的代碼仍然會結束的原因是,在 NodeJS 中,函式resolve超出范圍,向 V8 JS 引擎表明 Promise永遠無法決議。因此它結束了async () => {...},它又退出了,因為它是最后一個仍在運行的函式。
uj5u.com熱心網友回復:
您需要呼叫您的resolve()方法,以便回圈可以進一步進行,如下所示
(async() => {
while (true) {
const data = await new Promise(resolve => setTimeout(() => resolve("hello"), 1000))
console.log(data)
}
})();
uj5u.com熱心網友回復:
你還沒有兌現你的諾言。
Node 可以判斷沒有更多的事件源可能使一些有趣的事情發生(沒有更多的計時器被安排)所以它退出,即使有一個未解決的承諾。
比較這個版本,它將永遠列印hello,因為當超時完成并安排新的超時時,promise 被解決,從而確保事件佇列中總是有一些東西,給 Node.js 一個繼續運行程式的理由.
(async () => {
while (true) {
await new Promise(resolve => setTimeout(() => {
console.log("hello");
resolve();
}, 1000))
}
})();
如果沒有resolve被呼叫,那么 Promise 就不會被解決,并且 await 永遠不會完成,也不會安排新的超時。事件佇列清空,節點決定繼續什么都不做是徒勞的,所以它退出了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/437177.html
標籤:javascript 节点.js
