Search code examples
node.jsasynchronouses6-promise

Returning promise inside loop does not stop the loop


The following method should return either a rejected OR a resolved promise, but it seems to return both:

function isNotAlreadyRegistered(newsletterJsonArray, parsedJson){
const emailAsId = parsedJson["email"];

    newsletterJsonArray.forEach(function(entry) {
        if( entry["email"] == emailAsId){
            console.log("User already registered.");
            return Promise.reject();
        }
    });
    console.log("User not registered.")
    return Promise.resolve();
}

The method logs both messages:

  1. "User already registered."
  2. "User not registered."

So in the following i can not handle the promise. Which point did i miss?


Solution

  • You can't stop forEach loop by returning anything. The only way to stop it is to throw an error which is NOT recommended way to do you logic.

    You could use Array.prototype.some instead.

    function isNotAlreadyRegistered(newsletterJsonArray, parsedJson){
      const emailAsId = parsedJson.email;
      return newsletterJsonArray.some(function(entry) {
        return entry.email === emailAsId
      }) ? Promise.reject() : Promise.resolve();
    }