Готов поспорить, это как-то связано с асинхронностью.
В основном, я проверяю, существует ли уже строка (ответ на вопрос), и если да, то страница должна просто отображать сообщение, иначе должен добавить новый вопрос в массив.
Итак, чтобы реорганизовать код, я создал функцию с именем isDuplicateAnswer
(да, она привязана к компоненту). Вот его код:
isDuplicateAnswer() {
if (this.state.answersToCurrentQuestion.length > 0) {
this.state.answersToCurrentQuestion.map(answer => {
if (this.state.answerTextTyped === answer.text) {
console.log("true"); // executed twice but then adds it to the array (not supposed to)
return true;
}
});
}
}
На основе этой проверки код будет делать следующее:
if (
event.target.id === "submitAnswer" &&
this.state.answerTextTyped !== null &&
this.isDuplicateAnswer()
) {
console.log("Something is wrong"); // This line is never executed (no log, no message)
return this.props.handleMessage(
"There is already another answer with this text. Please add a different one."
);
} else if (
event.target.id === "submitAnswer" &&
this.state.answerTextTyped !== null &&
!this.isDuplicateAnswer()
) {
console.log("Everything OK"); // not displayed but rest of the code goes through (answer added)
this.setState({ answerText: this.state.answerTextTyped }, () => {
(() => {
let answersToCurrentQuestion = [
...this.state.answersToCurrentQuestion,
];
answersToCurrentQuestion.push({
text: this.state.answerText,
isCorrect: this.state.isCorrectAnswer,
});
this.setState({ answersToCurrentQuestion });
if (this.state.isCorrectAnswer === true) {
this.incrementCorrectAnswers();
}
})();
(() => {
this.props.handleMessage("");
this.setState({
isValid: true,
isCorrectAnswer: false,
answerTextTyped: null,
});
this.refreshAnswerTypedForm();
this.getAnswerTypedForm();
})();
});
}
Моя проблема в том, что если isDuplicateAnswer
равно false
, то в моем журнале написано «Все в порядке», но когда он возвращает true
, создается ответ, что приводит к ошибке из-за того, что ключ HTML не уникален, хотя журнал из isDuplicateAnswer
отображается дважды.
Учитывая, что две другие проверки в страже работают правильно, что я здесь делаю не так?
РЕДАКТИРОВАТЬ
это состояние прямо перед нажатием на «Добавить ответ» ", идентификатор которого submitAnswer