Угловой ответ получить после окончания цикла подписки - PullRequest
0 голосов
/ 29 мая 2019

заранее спасибо за ваше время.

Я зацикливаю 2 конечных точки служб для получения данных, проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы дождаться окончания первой подписки, чтобы зациклить другую, но результат за пределами первой подписки пуст и если я помещу второй цикл в предыдущую подписку, я столкнусь с дублированием и / или неопределенными переменными.

Я пробовал два способа

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

Второе решение, которое я попробовал, - это использование forkJoin, но у меня есть две проблемы с этим.

Первая проблема, которую я имею при использовании forkJoin, заключается в том, что я получаю Pageable из своего бэкэнда (используя загрузку java - spring) для управления нумерацией страниц, поэтому я не могу сделать правильную нумерацию страниц, потому что forkJoin получает пагинацию в массиве, поэтому детали больше не нужны, так как они разбиты на массивы.

Вторая проблема, с которой я сталкиваюсь при использовании forkJoin, заключается в том, что каждый раз, когда я нажимаю снова, чтобы извлечь данные, он добавляет результат к старому, создавая бесконечные дубликаты (даже когда я устанавливаю свой массив пустым при каждом нажатии кнопки)

Я поделюсь с вами, ребята, обоими примерами, которые я пробовал, и конечными точками обслуживания, которые я использую

Сервис 1:

getAllQuestionsEvaluation(page: number, level: number, profu: number, idComponent: number): Observable<any> {
    return this.http.get(this.urlEndpoint + 'page/' + page + '/' + level + '/' + profu + '/' + idComponent, {headers: this.headerService.addAuthHeader()}).pipe(
      catchError((e) => {
        this.headerService.serverError(e);
        if (this.headerService.isNoAuth(e)) {
          this.appDialogService.confirm();
        }
        return throwError(e);
      })
    );
  }

Сначала я зацикливаю эту конечную точку, а затем мне нужно зациклить результат для следующей службы, чтобы получить другие данные:

Сервис 2:

getAllByIdQuestion(idQuestion: number): Observable<any> {
    return this.http.get(this.urlEndpoint + 'findbyidq/' + idQuestion, {headers: this.headerService.addAuthHeader()}).pipe(
      catchError((e) => {
        this.headerService.serverError(e);
        if (this.headerService.isNoAuth(e)) {
          this.appDialogService.confirm();
        }
        return throwError(e);
      })
    );
  }

Первый код, который я пробовал, следующий, однако я сталкиваюсь с дубликатами и проблемами с результатом:

jsonComponentsResult является результатом массива компонентов, однако этот сервис не зацикливается, поэтому у меня нет проблем с ним, и поэтому я не делюсь этим кодом.

this.questions = [];
this.questionsToCompare = [];

for (let com of jsonComponentsResult) {
  this.questionService.getAllQuestionsEvaluation(0, this.evaluation.level, this.evaluation.profu, com.idComponent.idComponent).subscribe(
    (jsonQuestions) => {

      this.questionsToCompare = this.questionsToCompare.concat(jsonQuestions.content);

      for (let i = 0; i < this.questionsToCompare.length; i++) {
        this.questionsGradeService.getAllByIdQuestion(this.questionsToCompare[i].idQuestion).subscribe(
          (response) => {
            this.questionsGrades = this.questionsGrades.concat(response);

            for (let p of this.questionsGrades) {
              if (this.evaluation.idGrade.idGrade === p.idGrade.idGrade) {
                this.questions = this.questions.concat(p.idQuestion);
              }
            }

            this.dataSource = new MatTableDataSource < Questions > (this.questions);
          }
        );
      }



      this.pageIndex = jsonQuestions.number;
      this.pageSize = jsonQuestions.size;
      this.length = jsonQuestions.totalElements;


    },
    (error) => {
      console.log(error);
    }
  );
}

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

observables: Observable < Questions > [] = [];
observablePG: Observable < QuestionsGrade > [] = [];

this.questions = [];
this.questionsToCompare = [];
this.questionsGrades = [];

for (let i = 0; i < jsonComponentResult.length; i++) {
  this.observables.push(this.questionService.getAllQuestionsEvaluation(0, this.evaluation.level, this.evaluation.profu, jsonComponentResult[i].idComponent.idComponent));
}
Observable.forkJoin(this.observables).subscribe(
  (response) => {
    for (let x of response) {
      this.questionsToCompare = this.questionsToCompare.concat(x);
    }
    this.observables = [];
    this.getQuestions(this.questionsToCompare);
  },
  (e) => {
    console.log(e);
  }
);

private getQuestions(questionsArray: any) {

  for (let i = 0; i < questionsArray.length; i++) {
    this.observablePG.push(this.questionsGradeService.getAllByIdQuestion(questionsArray[i].idQuestion));

    this.questions = [];
    this.questionsToCompare = [];

  }
  Observable.forkJoin(this.observablePG).subscribe(
    (response) => {

      for (let x of response) {
        this.questionsGrades = this.questionsGrades.concat(x);
      }
      this.observablePG = [];

      for (let p of this.questionsGrades) {
        if (this.evaluation.idGrade.idGrade === p.idGrade.idGrade) {
          this.questions = this.questions.concat(p.idQuestion);
        }
      }

      this.dataSource = new MatTableDataSource < Questions > (this.questions);

    },
    (e) => {
      console.log(e);
    }
  );
}

Я хотел бы дождаться окончания первой подписки, чтобы зациклить другую, но я не смог найти решение, поскольку похоже, что зацикливание этих служб одновременно вызывает проблемы, и с помощью forkJoin я теряю свою нумерацию страниц и снова получаю весь список каждый раз, когда нажимаю кнопку.

Я хотел бы получить список вопросов, а затем получить разделы вопросов для сравнения, если я добавлю этот вопрос в массив вопросов.

Извините за длинный пост и спасибо за ваше время.

1 Ответ

0 голосов
/ 29 мая 2019

Может быть, Страница решений оператора rxjs Страница может помочь вам в этом.

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

...