我的以下代码是项目验证部分的一部分。这段代码的目的是检查引用表中是否存在值。如果存在,则可以继续。如果不是,则抛出错误并停止用户。
saveChanges() {
//blah blah
if (needTovalidate){
passedCheck = false;
this.validationService.checkExistence(value)
.then((exist: boolean) => {
passedCheck = exist;
console.log("INSIDE: " + exist);
});
console.log("OUTSIDE: " + passedCheck);
if(passedCheck) {
//Rest of code
} else {
//Throw error msg
}
}
public async checkExistence(value: string): Promise<boolean>{
var exist = false;
return this.getRefData().then((rec: dataModel[]) => {
return rec.some(el => {
return el.col1 === value;
});
});
}
private async getRefData() {
return await this.configurationService.retrieveTableData().toPromise();
}
预期日志:
INSIDE: true
OUTSIDE:true
实际日志:
OUTSIDE: false
INSIDE: true
很明显,代码在继续下一行之前并没有等待布尔诺式解决。
有什么建议吗?
答案 0 :(得分:1)
正如@ jfriend00在您的评论讨论中提到的,这是对类似问题的重复,每当使用异步函数(Promise
,Observable
)时,您都应使异步性回到调用中,{{ 1}}或.then
。
Return value with asynchronous functions in Typescript
有什么建议吗?
您可以通过类似的方式更改.subscribe
和saveChanges
函数:
请参见下面的示例,并可能在编辑中清理问题示例代码(如果不重写以提出更好的示例问题,我相信您至少可以花一些时间在过程中自行解决问题)再次仔细检查一下)
您提供的伪代码有两个问题,但是我尝试尽最大可能在概念上对过程进行概念化,同时保持对您原始代码的忠诚。
checkExistence
这是在Angular中,这可能与Angular形式有关吗? Async validators might be helpful to you even if not directly related
与Return value with asynchronous functions in Typescript类似的问题,也许还有很多其他问题
我发现在这些类型的问题中存在类似的不一致之处,可以通过在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;
});
});
}
中进行显式键入来解决,以提供对事件的更快反馈,以防止出现问题!
如果您需要更多具体的帮助,请提供原始代码的重构版本,因为某些内容似乎已被弱替换。
否则,我们可以更清晰地处理伪代码。 由于这似乎是一个重复的问题,会产生类似的异步错误,所以您需要提供一个代码无法正常工作的上下文,否则其他问题已经提供了全面的答案。
在对纠结的代码进行故障诊断时,它可以帮助您首先将整个程序流重写为伪代码,然后根据该代码重新生成代码以巩固您要理解的内容。 (这就是为什么我有时建议手写您的程序,或者至少将所有内容分解为分配的变量,显式键入所有内容,并尽可能多地使用TypeScript
语言服务的原因。< / sub>
编辑:我看到您已经已经重复了自己的问题,该问题更加清楚了,并且正在努力解决您的问题。希望您能将您的问题更新到一个地方。从其他问题的注释中,您似乎不想遵循关于TypeScript
的基本异步用法的建议,而仍然希望依赖于尚不存在的突变值(异步)。
答案 1 :(得分:0)
我最简单的使用方法是创建一个布尔变量,并在then
和catch
中将其设为false
示例:
let isPromisePending = false;
function someFn() {
isPromisePending = true;
myPromise().then(() => {
isPromisePending = false;
//Success handler below
}).catch(() => {
isPromisePending = false;
//Error handler below
})
}