Асинхронный вызов в Angular2 - PullRequest
0 голосов
/ 21 декабря 2018

Я вызываю эту 2 функцию this.fetchTables ();this.fetchAllTables ();в конструкторе файла demo.ts в Angular.

Оба получают вызов API.Из этих двух звонков 1 звонок терпит неудачу каждый раз.Иногда я получаю результат для fetchTables.Иногда я получаю результат для fetchallTables.

      constructor(private api:BackendApiService, private spinner: NgxSpinnerService, private utills:CommonUtillsService, private router: Router) {
            // reload or refresh page on active click
            this.router.routeReuseStrategy.shouldReuseRoute = function() { return false; }; 
this.fetchTables();
    this.fetchAllTables();

           }

           fetchTables() {
            this.api.getTableAccess().subscribe(data => {
              this.spinner.hide();
              console.log('Data to get tables', data);
              if(data) {
                this.data = data.body.entities;
                this.showNoTableRecordList = false;
              }
            },
            (err: HttpErrorResponse) => {
              if (err.status == 401) {
                window.location.href = Constants.GANDALF_HOST;
              }
              this.spinner.hide();
              if (err.error instanceof Error) {
                //A client-side or network error occurred.
                toast(Constants.TOAST_PREFIX+Constants.SOMETHING_WRONG, Constants.TOAST_DURATION);
              } else {
                //Backend returns unsuccessful response codes such as 404, 500 etc.
                toast(Constants.TOAST_PREFIX+Constants.SOMETHING_WRONG, Constants.TOAST_DURATION);
              }
            });
           }

          fetchAllTables() {
            this.api.getAllTable().subscribe(data => {
                this.spinner.hide();
                if(data) {
                  this.allTables = data.body;
                  this.showNoTableRecordList = false;
                } else {
                  this.showNoTableRecordList = true;
                }
              },
              (err: HttpErrorResponse) => {
                if (err.status == 401) {
                  window.location.href = Constants.GANDALF_HOST;
                }
                this.spinner.hide();
                if (err.error instanceof Error) {
                  //A client-side or network error occurred.
                  toast(Constants.TOAST_PREFIX+Constants.SOMETHING_WRONG, Constants.TOAST_DURATION);
                } else {
                  //Backend returns unsuccessful response codes such as 404, 500 etc.
                  toast(Constants.TOAST_PREFIX+Constants.SOMETHING_WRONG, Constants.TOAST_DURATION);
                }
              });
          }

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я бы предположил, что в подписке на обе эти наблюдаемые есть какая-то ошибка (я не могу определить из-за частичного совместного использования файла здесь).Таким образом, всякий раз, когда один из запросов завершается, выполняется его подписка, которая выдает ошибку и, следовательно, не позволяет запустить вторую подписку.

Я могу ошибаться, но для подтверждения мне потребуются дополнительные сведения о вашей ошибке.Кроме того, как упомянул @Erbsenkoenig, если вы планируете делать два вызова вместе, я бы рекомендовал использовать concatMap или mergeMap или что-то подобное.

0 голосов
/ 21 декабря 2018

Вы не будете подписываться внутри обеих наблюдаемых, а скорее объедините обе наблюдаемые, используя RxJS.Есть несколько способов, как вы можете их объединить: один из них будет CombineLatest, который генерируется, если каждый дочерний элемент излучается один раз, а затем один раз на дочерний элемент излучается снова.Вот документация по всем операторам объединения: https://www.learnrxjs.io/operators/combination/

Чтобы выполнить что-то, когда один наблюдаемый испускает, вы можете использовать оператор касания, если вы не хотите делать все, что находится в ваших подписках, в одной отдельной подпискеваша совокупная наблюдаемая

...