@ Решение Анкифа Агарвала не было правильным, но оно указало мне правильное направление.
Метод forEach () не имеет короткого замыкания и поэтому вызывает функцию next () более одного раза ( Короткое замыкание Array.forEach, например, вызов прерывания ).
Мне удалось решить эту проблему одним из двух способов.
Извлекая вызов функции next () изЛогика forEach ():
function myFunc(next, obj) {
const pairs = {};
let err = null;
obj.listing.forEach((element) => {
if (element.x in pairs && pairs[element.x] !== element.y) {
err = new Error('This was not ok');
} else {
pairs[element.x] = element.y;
}
});
if (err !== null) {
next(err);
} else {
next();
}
}
Однако это все равно заставляет forEach () проходить через все элементы. Если возможно, кажется, что лучше замкнуть его и оборвать его, как только произойдет нарушение, которое устанавливает ошибку следующим образом:
function myFunc(next, obj) {
const pairs = {};
const BreakException = {};
let err = null;
try {
obj.listing.forEach((element) => {
if (element.x in pairs && pairs[element.x] !== element.y) {
err = new Error('This was not ok');
throw BreakException;
} else {
pairs[element.x] = element.y;
}
});
next();
} catch (e) {
if (e !== BreakException) throw e;
next(err);
}
}
Надеюсь, кто-то может использовать это в будущем.