Как продолжить выполнение функций по цепочке, если произошла ошибка?

#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();