在Angular 6
中,每当用户在我们应用程序的表中输入新记录时,我就使用函数save()
。
在save()
内,我们检查两件事:
1.'前端'验证错误又称'如果“项目”列为空,则无法在“价格”列中输入价格。。在这种情况下,数据永远不会发送到数据库。
2.“后端”错误AKA用户尝试输入重复记录。这确实尝试通过我们的服务将日志发布到数据库,但是数据库返回错误(数据库无法接受记录,其中每一列都是重复的)。
这些检查完成后,我将有两个变量frontendChecked
和backendChecked
设置为'true'。
在save()
的结尾处,我正在(错误地)尝试通过使用if statement
检查这两个变量是否为真来完成上述两个过程。由于后端错误的异步性质,因此if statement
永远不会运行。
myComponent.ts:
save() {
var frontendChecked = false;
var backendChecked = false;
//----------- check for front end errors -----------//
for(var i=0; i< records.length; i++) {
// check for front end errors here
if( i === records.length - 1) {
frontendChecked = true;
}
}
//----------- check for backend errors (forkjoin is an observable in our service which returns asynchronously - we subscribe to it here) -----------//
this.myService.forkJoin(myArray)
.subscribe(
data => {
for (var i = 0; i < records.length; i++) {
//check for backend errors here
if( i === records.length - 1) {
backendChecked = true;
}
}
}
);
//----------- this if statement never runs because backendChecked is not finished in time -----------//
if (frontendChecked && backendChecked) {
// I need to do these things last
}
}
如何设置两个变量都设置后在save()
末尾的if语句实际运行?我一直在研究async/await
中的承诺和可观察性。 this.myService.forkJoin
的结果实际上来自我们订阅了可观察的forkJoin
,这使我有些不安。有什么想法吗?
答案 0 :(得分:1)
将其更改为:
this.myService.forkJoin(myArray)
.subscribe(
data => {
for (var i = 0; i < records.length; i++) {
//check for backend errors here
if( i === records.length - 1) {
backendChecked = true;
}
}
if (frontendChecked) {
// I need to do these things last
}
}
);