Как @ jfriend00 упоминает в ваших комментариях о том, что это пара похожих вопросов, всякий раз, когда вы используете асинхронные функции (Promise
, Observable
), вы должны добавить асинхронность обратно к вызову и .then
или * 1004. * это там.
Возвращаемое значение с асинхронными функциями в Typescript
Есть предложения?
Вы можете изменить свои функции saveChanges
и checkExistence
аналогично следующему:
Пожалуйста, посмотрите пример ниже и, возможно, очистите ваш пример кода вопроса в редактировании (если не переписать, чтобы сделать лучший пример вопроса, я думаю, что вы, по крайней мере, можете решить свою проблему самостоятельно, потратив время снова пройти через это кропотливо)
Есть несколько проблем с предоставленным вами псевдокодом, но я попытался осмыслить процесс как можно лучше, оставаясь верным исходному коду.
saveChanges(needToValidate: boolean, // ??
changesToValidate: Changes,
asyncValidateFunction: (changes: Changes) => Promise < boolean > , // hmm
) {
asyncValidateFunction(changesToValidate);
//blah blah
if (needToValidate) { // Random context here? Feels like too many things going on in one. Try to isolate functionality.
this.validationService.checkExistence(value)
.then(
(exist: boolean) => {
yourStuffToDoAfterPassedCheckValidation(exist) // hmm
console.log("INSIDE: " + exist); // be safe and stay inside :)
}
);
}
}
// Tried to encapsulate as much as your original concept and style from original question.
// Please refactor this based on your understanding
yourStuffToDoAfterPassedCheckValidation(passedCheckFlag: boolean) {
if (passedCheckFlag) {
// Rest of code
} else {
// Throw error msg
}
}
public checkExistence(value: string): Promise < boolean > {
// Unused junk code? var exist = false;
return this.getRefData()
.then(
(rec: dataModel[]) => {
return rec
.some(el => {
return el.col1 === value;
});
});
}
Поскольку это в Angular, может ли это быть связано с угловыми формами? Асинхронные валидаторы могут быть вам полезны, даже если они не связаны напрямую
Подобный вопрос к Возвращаемое значение с асинхронными функциями в Typescript и, возможно, многих других
Я вижу подобные несоответствия в этих типах вопросов, которые можно исправить с помощью явного ввода в TypeScript
, чтобы обеспечить более быструю обратную связь о вещах, чтобы защититься от неправильных действий!
Если вам нужна более конкретная помощь, предоставьте переработанную версию исходного кода, потому что некоторые вещи казались слабо замененными.
В противном случае мы могли бы работать с псевдокодом с большей ясностью.
Поскольку этот вопрос кажется дублирующим и допускает похожие асинхронные ошибки, вы должны указать контекст, в котором ваш код не работает, в противном случае исчерпывающие ответы уже доступны в других вопросах ?.
При устранении неполадок в запутанном коде это может помочь вам сначала переписать весь программный поток в виде псевдокода, а затем сгенерировать код, основанный на этом, чтобы объединить то, что вы пытаетесь понять. (Вот почему я иногда рекомендую написать от руки вашу программу или, по крайней мере, разбить все на назначенные переменные, явно ввести все и максимально использовать языковую службу TypeScript
, насколько это возможно.
Редактировать: Я вижу, вы уже уже продублировали свой собственный вопрос, который немного яснее и работает над решением ваших проблем. Хотелось бы, чтобы вы только что обновили свой вопрос в одном месте. Из комментариев на ваши другие вопросы вы, похоже, не хотите следовать предложениям по фундаментальному асинхронному использованию Promise
и все еще хотите зависеть от измененного значения, которое еще не существует (асинхронно).