javascript forEach manage exceptions
Asked Answered
S

1

10

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?

Subjugate answered 30/7, 2018 at 11:47 Comment(1)
Just on another note for using exceptions inside the forEach. it is usually not recommended to use forEach loop if you have to throw an exception inside. Its rather useful to use every, some. This is defined in MDN documentation as wellGenaro
S
9

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());
  }
}
Shrieval answered 30/7, 2018 at 11:50 Comment(1)
thank you, but how can I use the errors array? I'm using jest and I have the id does not exists output only, even with id = 1Subjugate

© 2022 - 2024 — McMap. All rights reserved.