【问题标题】:Cleancode: try/catch in PromiseCleancode:在 Promise 中尝试/捕获
【发布时间】:2017-05-22 21:16:12
【问题描述】:

我正在处理 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);
  });
};

可能更清洁的方式?!

【问题讨论】:

    标签: javascript ecmascript-6 coding-style es6-promise


    【解决方案1】:

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

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

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

    它被转换为拒绝。

    【讨论】:

    • 很好的解释! Promise 构造函数中任何未处理的异常都会自动包装在被拒绝的 Promise 中。对于 then() 中新创建的 Promise 也是如此,这使得在内部使用 throw() 变得很容易。 (见25.4.1.3.2 in ES6 spec
    【解决方案2】:

    你可以使用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();
    }
    

    【讨论】:

    • 这对我不起作用:“未捕获的错误:传递给 reduxForm 的 asyncValidate 函数必须返回一个承诺”
    • 返回一个 Promise 的生成器和返回一个 Promise 不一样?!也许你的意思是 ES8 async function
    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2019-08-25
    • 2017-09-12
    • 1970-01-01
    • 2018-01-14
    • 2010-09-12
    相关资源
    最近更新 更多