Выполнить оператор if только после завершения других процессов в функции (async / await / promises и observable) - PullRequest
0 голосов
/ 20 марта 2019

В Angular 6 я использую функцию save() всякий раз, когда пользователь вводит новую запись в таблицу в нашем приложении.

В пределах save() мы проверяем две вещи:
1. Ошибки проверки 'front end' AKA 'вы не можете ввести цену в столбец' Price ', если столбец' Item 'пуст' '1008 *. В этом случае данные никогда не отправляются в базу данных.
2. ошибки 'back end' Пользователь AKA пытается ввести дубликат записи. Это действительно пытается POST к базе данных через наш сервис, но база данных возвращает ошибку (база данных не может принимать записи, где каждый столбец является дубликатом).

Как только эти проверки завершены, у меня есть две переменные 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
   }

}

Как я могу убедиться, что мой оператор if в конце save() действительно выполняется после того, как обе эти переменные были установлены? Я смотрел на async/await с обещаниями, а также с наблюдениями. Результат this.myService.forkJoin фактически получен из-за того, что мы подписались на наблюдаемое forkJoin, что немного сбивает меня с толку. Есть идеи?

1 Ответ

1 голос
/ 20 марта 2019

Измените его на:

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
           }
       }
   );
...