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();
});
它被转换为拒绝。
我正在研究 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();
});
它被转换为拒绝。