'Why does nodejs stop execution of while true loop inside async function

I'd like to understand better under what conditions nodejs stops a running process. My guess was that it stops the process when both the stack and the event loop are empty. But the following program only prints hello once, whereas I was expecting it to loop forever, printing hello every second.

(async () => {
  while (true) {
    await new Promise(resolve => setTimeout(() => console.log("hello"), 1000))
  }
})();

How does the while (true) loop interact with the event loop?



Solution 1:[1]

You need to call your resolve() method ,such that loop can proceed further,like below

(async() => {
  while (true) {
    const data = await new Promise(resolve => setTimeout(() => resolve("hello"), 1000))
    console.log(data)
  }
})();

Solution 2:[2]

You haven't resolved your promise.

Node can tell that there are no more event sources that might make something interesting happen (no more timers are scheduled) so it exits, even though there is an unresolved promise.

Compare this version, which will print hello forever, because the promise is resolved when the timeout completes and a new timeout is scheduled, thus ensuring that there is always something in the event queue, giving Node.js a reason to carry on running your program.

(async () => {
  while (true) {
    await new Promise(resolve => setTimeout(() => {
        console.log("hello");
        resolve();
    }, 1000))
  }
})();

If resolve is not called, then the promise is not resolved, and the await never completes and no new timeout is ever scheduled. The event queue empties and node decides that to go on doing nothing would be futile, so it exits.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Shubh
Solution 2