1

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?

1
  • 1
    You never call resolve, your promise never resolves. Commented Mar 3, 2022 at 20:34

3 Answers 3

2

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.

Sign up to request clarification or add additional context in comments.

Comments

2

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)
  }
})();

Comments

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.