Search code examples
javascriptecmascript-6coding-stylees6-promise

Cleancode: try/catch in Promise


I am working on redux-form atm and found the piece of code. Its working for me but is there any cleaner way to write this in ES6 style?

const asyncValidate = (values/* , dispatch */) => {
  return new Promise((resolve, reject) => {
    try {
      if (['john', 'paul', 'george', 'ringo'].includes(values.name)) {
        const error = {
          name: 'That username is taken'
        };
        throw error;
      }
      resolve();
    } catch (e) {
      reject(e);
    }
  });
};

I would appreciate your help


Solution

const asyncValidate = (values/* , dispatch */) => {
  return new Promise((resolve, reject) => {
    const errors = {};
    if (['john', 'paul', 'george', 'ringo'].includes(values.name)) {
      errors.name = 'That username is taken';
    }
    reject(errors);
  });
};

probably cleaner way?!


Solution

  • try/catch is redundant in promise chains and promise executor functions.

    Any error thrown is automatically converted to a rejection of the promise you're supposed to return. The promise code calling your function takes care of this. So just do:

    const asyncValidate = values => new Promise(resolve => {
      if (['john', 'paul', 'george', 'ringo'].includes(values.name)) {
        throw { name: 'That username is taken'};
      }
      resolve();
    });
    

    and it gets converted to a rejection.