仅在函数中的其他过程完成后执行if语句(异步/等待/承诺与可观察)

时间:2019-03-20 17:00:12

标签: angular typescript asynchronous promise observable

Angular 6中,每当用户在我们应用程序的表中输入新记录时,我就使用函数save()

save()内,我们检查两件事:
1.'前端'验证错误又称​​'如果“项目”列为空,则无法在“价格”列中输入价格。。在这种情况下,数据永远不会发送到数据库。
2.“后端”错误AKA用户尝试输入重复记录。这确实尝试通过我们的服务将日志发布到数据库,但是数据库返回错误(数据库无法接受记录,其中每一列都是重复的)。

这些检查完成后,我将有两个变量frontendCheckedbackendChecked设置为'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,这使我有些不安。有什么想法吗?

1 个答案:

答案 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
           }
       }
   );