заранее спасибо за ваше время.
Я зацикливаю 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 я теряю свою нумерацию страниц и снова получаю весь список каждый раз, когда нажимаю кнопку.
Я хотел бы получить список вопросов, а затем получить разделы вопросов для сравнения, если я добавлю этот вопрос в массив вопросов.
Извините за длинный пост и спасибо за ваше время.