Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

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?

You haven't mistaken how NodeJS works. Your code just has a bug: resolve never gets called.

If you change it to the following, "hello" prints forever at 1 second intervals:

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

The reason your code would still end is because, in NodeJS, the resolve function falls out of scope, indicating to the V8 JS engine that the Promise can never resolve. Therefore it ends the async () => {...}, which in turn quits since it's the last function still running.

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

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.

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.