Search code examples
javascripttestingforeacherror-handlingthrow

javascript forEach manage exceptions


I have a forEach loop that check if there are conditions before pushing data in the array:

allow(id, perm, arr) {
  const data = { "userId": id, "permissionId": perm };

  arr.forEach(key => {
    if (id !== key.userId) {
      throw new Error('id does not exists');
    } else {
      if (perm === key.permissionId) {
        throw new Error('perm exists in this id');
      } else {
        arr.push(data);
      }
    }
  });
}

The original array arr is like this:

[{"userId": 1,"permissionId": 1},
 {"userId": 2,"permissionId": 1},
 {"userId": 3,"permissionId": 0},
 {"userId": 4,"permissionId": 0}]

if I use console.log() all works, but when I throw an error the execution stops, but how can I manage the exceptions without stop looping?


Solution

  • throw is designed to stop your loop/code invocation. If you want to throw those errors after loop, you can push all errors to the array and throw them at the end:

    allow(id, perm, arr) {
      const data = { "userId": id, "permissionId": perm };
      const errors = [];
    
      arr.forEach(key => {
        if (id !== key.userId) {
          errors.push('id does not exists');
        } else {
          if (perm === key.permissionId) {
            errors.push('perm exists in this id');
          } else {
            arr.push(data);
          }
        }
      });
    
      if (errors.length > 0) {
        throw new Error(errors.join());
      }
    }