Cleancode:try/catch 在 Promise 中

Cleancode: try/catch in Promise

我正在研究 redux-form atm 并找到了这段代码。它对我有用,但有没有更简洁的方法来用 ES6 风格编写它?

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

非常感谢你的帮助


解决方案

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

可能是更清洁的方法?!

您可以使用 Conditional (ternary) Operator 来简化 if-statement,而且您在这里不需要 catch 块:

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

//ES6 - using "generators"
const asyncValidate = function* (values) {
    return yield ['john', 'paul', 'george', 'ringo'].includes(values.name) ? Promise.reject('That username is taken') : Promise.resolve();
}

try/catch 在承诺链和承诺执行函数中是多余的。

抛出的任何错误都会自动转换为拒绝您应该做出的承诺 return。调用您的函数的承诺代码会处理这个问题。所以就这样做:

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

它被转换为拒绝。