【发布时间】:2018-12-14 14:00:21
【问题描述】:
我的以下代码是项目验证部分的一部分。这段代码的目的是检查引用表中是否存在值。如果确实存在,则可以继续。如果不是,则抛出错误并停止用户。
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
显然,代码在继续下一行之前没有等待布尔诺言解决。
有什么建议吗?
【问题讨论】:
-
将其余代码放在
.then()处理程序中。这是诺言中的布尔值唯一有效的地方。这是一个异步操作。.then()处理程序在未来某个不确定的时间被调用。.then()处理程序之后的其余函数在promise 完成之前和.then()处理程序被调用之前执行。因此,唯一使用 promise 结果的地方是在.then()处理程序中。这里可能有超过 1000 个此类问题的其他示例,所以如果您想搜索的话,会有很多重复。 -
谢谢@jfriend00 我也看过很多帖子,但不确定我的情况是否有所不同...谢谢。
-
没有什么不同。将在异步回调中获得的值分配给更高范围的变量,以便您可以“希望”在其他地方使用它,这在 node.js 中几乎总是一个错误。这是一个明显的警告信号,表明你做错了。在回调中使用您获取它的值或将其传递给您从该回调中调用的另一个函数。这就是你在 node.js 中编写异步代码的方式。
-
另外
return await xxxx()是一种浪费。只需执行return xxxx()。他们都返回了一个承诺,该承诺将以适当的价值解决。您必须在返回的 Promise 上使用.then()才能获取值。