#javascript #try-catch #this #chaining #throw
#javascript #попробуйте-поймайте #это #цепочка #бросить
Вопрос:
Итак, я должен создать некоторые функции с цепочками для проверки, например:
isValid('Test string').required().isString().min(5);
и функция должна выдавать ошибку, если что-то не сравнивается.
У меня проблема, если что-то выдает ошибку, то оно не продолжает работать, я попытался добавить try catch, но затем тесты показывают мне, что он не выдает ошибку. Я хочу пройти тест с.toThrowError() и продолжить цепочку
function isValid(str) {
return {
required: function() {
if (str === '') {
console.log("dasdsada2",str, this)
throw new Error('Required!');
}
return this;
},
isString: () => {
if (typeof str !== 'string') {
throw new Error('Should be a string!');
}
return this;
},
min: (minNum) => {
if (str.length < minNum) {
throw new Error('Should be more than min');
}
return this;
}
};
}
Комментарии:
1. Какое поведение вы хотите иметь? Что вы хотите, чтобы произошло, когда условие не выполнено?
Ответ №1:
Вы можете создать функцию, которая оборачивает все функции оболочкой, которая улавливает ошибки и сохраняет их в массиве, а затем метод, который в конце соберет все ошибки вместе:
function wrapErrors(obj) {
const errors = [];
const ret = {};
for (const key in obj) {
const func = obj[key];
ret[key] = function() {
try {
func.apply(this, arguments);
} catch (err) {
errors.push(err.message);
}
return this;
};
}
ret.throwErrors = function() {
if (errors.length > 0) {
throw new Error("Got errors: " errors.join(", "));
}
return this;
};
return ret;
}
// throws nothing
wrapErrors(isValid('Test string')).required().isString().min(5).throwErrors();
// throws 'Got errors: Required!, Should be more than min'
wrapErrors(isValid('')).required().isString().min(5).throwErrors();