у меня есть массив
errorPriority: string[] = ['shippingError', 'paymentInfoError', 'generalError'];
Мне нужно, чтобы вызов функции зацикливался на каждом элементе массива, но каким-то образом после выполнения функции для первого элемента «shippingError» цикл останавливается. Ниже приведен вызов функции
this.errorPriority.every(this.getErrorData);
И функция, которая выполняется
getErrorData = (value: string): void => {
if (eval(this.objectPath[value as keyof ObjectPath]) && eval(this.objectPath[value as keyof ObjectPath]).length)
this.checkoutState.errors[value] = eval(this.objectPath[value as keyof ObjectPath]);
}
Иногда это работает с элементом массива, но в основном останавливается после первого элемента. Я что-то упустил, пожалуйста, помогите
Я ожидаю, что функция должна быть зациклена на каждом элементе массива
Я могу измениться, но по какой причине происходит описанный выше сценарий?
Вы уверены, что понимаете всех? пожалуйста, проверьте developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Пожалуйста, прочитайте документацию для каждого. Вы ничего не возвращаете, поэтому он возвращает undefined. Undefined не соответствует действительности.
Также использование eval не очень хорошая практика. Обычно есть лучшие способы сделать что-то.
Понял возвращаемую часть, @epascarello - есть ли у вас какие-либо предложения для eval, потому что это строка, на которую я должен ссылаться для пути
каждая функция работает по-разному, она используется напр. чтобы проверить, все ли значения массива, скажем, имеют значение, а не неопределенное, это общий случай. Таким образом, вы передаете ему обратный вызов, который возвращает логическое значение, и в случае, если первый элемент в массиве не проходит проверку, нет причин продолжать цикл по остальным элементам, и поэтому он завершается. Вы должны использовать что-то другое для вашего случая, forEach, как было упомянуто выше, может быть лучшим выбором.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы используете каждую функцию, она просто проверит, успешно ли ВСЕ элементы вашего массива передают вашу функцию.
Таким образом, данная функция ДОЛЖНА возвращать логическое значение (true или false), но вы возвращаете void. попробуйте вернуть "true", если ваше условие успешно
getErrorData = (value) => {
if (eval(this.objectPath[value]) && eval(this.objectPath[value]).length) {
this.checkoutState.errors[value] = eval(this.objectPath[value]);
return true;
}
}
изменился таким образом, getErrorData = (значение: строка): ObjectPath => { if (eval(this.objectPath[значение в качестве ключа ObjectPath]) && eval(this.objectPath[значение в качестве ключа ObjectPath]).length) this.checkoutState. ошибки [значение] = eval (this.objectPath [значение в качестве ключа пути к объекту]); return eval(this.objectPath[значение как keyof ObjectPath]); };
это все равно прервется после того, как первый элемент не соответствует критериям, forEach - это безопасный способ поразить каждый элемент в массиве
Метод
every()проверяет, проходят ли все элементы массива тест, реализованный предоставленной функцией. Он возвращает логическое значение.
это означает, что Array#every() проверяет, соответствует ли каждый элемент в массиве критериям, проверенным данной функцией, и это означает, что данная функция должна возвращать логическое значение. Поскольку ваша функция возвращает void или в javascript undefined, это будет интерпретироваться как false. А поскольку every возвращает true только в том случае, если все элементы возвращают истинное значение, итерация может быть прервана после первого ложного значения.
чтобы запустить ваш код на every элементе, вам нужно использовать forEach
из документации MDN определение array.every()
Метод Every() проверяет, все ли элементы в массиве проходят проверку. реализуется предоставленной функцией. Он возвращает логическое значение.
поэтому array.every возвращает логическое значение. в вашем коде вы ничего не возвращаете. если условие истинно, вы только назначаете новое свойство.
должно работать следующее:
getErrorData = (value) => {
if (eval(this.objectPath[value]) && eval(this.objectPath[value]).length) {
this.checkoutState.errors[value] = eval(this.objectPath[value]);
return true;
}
return false
}это не будет постоянно поражать каждый элемент, оп попросил способ запустить метод для каждого элемента
return false бессмысленно, потому что возврат ничего означает возврат undefined (ложное значение, интерпретируемое как false), поэтому не беспокойте вас, чтобы вернуть false
@ Поль-Мари, ты прав. ему не нужно явно возвращать false, но лично мне нравится быть настолько явным, насколько я могу :)
@laian, может быть, я неправильно понял: «Я ожидаю, что функция должна зацикливаться на каждом элементе массива» 🤷🏼♂️
Используйте
forEach, а неevery. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…