#angular #rxjs
Вопрос:
Я хочу запустить два объекта поведения вместе,
ngOnInit(): void {
this.getProjects();
this.getEmployees();
this.initForm();
if(this.local_data.action === 'Update') {
this.filForm();
}
}
getEmployees() {
this._employeeService.getAllemployee();
this.subEmployee$ = this._employeeService.employee$.subscribe(
(employees) => {
this.employees = employees.employee;
this.employees.map((emp) => {
let obj = {
display: emp.firstName ' ' emp.lastName,
value: emp.id,
};
return obj;
});
this.optionsEmployee.push(this.employees);
}
);
}
getProjects() {
this._projectsService.getAllProjects();
this.subProject$ = this._projectsService.projects$.subscribe((projec) => {
this.projects = projec.projects;
this.projects.map((proj) => {
let obj = { display: proj.projectName, value: proj.id };
return obj;
});
this.optionsProjects.push(this.projects);
});
}
У меня два проекта и шесть сотрудников,
на выходе получается :
{ projects: Array(2), totalProjects: 2 }
У меня есть полные данные в массиве,
{ employee: Array(2), totalemployee: 6 }
{id: 48, firstName: undefined, lastName: undefined, phone: undefined, wagePerDay: undefined, …}
{id: 50, firstName: undefined, lastName: undefined, phone: undefined, wagePerDay: undefined, …}
все неопределенные,
когда я запускаю только сотрудника, я получаю все данные, но при совместном запуске они прослушиваются,
попытался установить (setTimeout) , это сработало, но не лучшие практики
услуга заключается в :
Обслуживание сотрудников:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { BaseURL } from '.';
import { IEmployee } from '../_interfaces/emplyee.interface';
@Injectable({
providedIn: 'root',
})
export class EmployeesService {
private employeeArray: IEmployee[] = [];
private employeeSubject = new BehaviorSubject<{
employee: IEmployee[];
totalemployee: number;
}>({ employee: this.employeeArray, totalemployee: 0 });
public employee$: Observable<{
employee: IEmployee[];
totalemployee: number;
}>;
constructor(private httpClient: HttpClient) {
this.employee$ = this.employeeSubject.asObservable();
}
getAllemployee(employeePerPage?: number, currentPage?: number) {
const queryParams = `?pagesize=${employeePerPage}amp;page=${currentPage}`;
return this.httpClient
.get(`${BaseURL}/employee` queryParams)
.pipe(
map((employee: any) => {
return {
employee: employee.result.map((employee: IEmployee) => {
return {
id: employee.id,
firstName: employee.firstName,
lastName: employee.lastName,
phone: employee.phone,
wagePerDay: employee.wagePerDay,
bankAccount: employee.bankAccount,
bankBranch: employee.bankBranch,
createdAt: employee.createdAt,
};
}),
totalemployee: employee.total,
};
})
)
.subscribe((transformData) => {
this.employeeArray = transformData.employee;
this.employeeSubject.next({
employee: [...this.employeeArray],
totalemployee: transformData.totalemployee,
});
});
}
}
Обслуживание проекта такое же техническое.
Комментарии:
1. Вы получите гораздо больше ясности относительно того, что происходит, когда немного очистите свой код. Некоторые проблемы здесь: (a) вы карту через массив, но вы ничего не возвращают, а вы игнорируете результирующий массив, (б) вы излишне через побочные эффекты
this.externalArray.push(obj);
(с) как вы удалили заявления — трудно сказать, что BehaviorSubjects ты имеешь в виду, (г) мы не знаем, когда сделают — так трудно помочь2. обновил свой код,
3. TBH Я не понимаю этого кода и того, чего вы хотите достичь. Я думаю, что вам может понадобиться очень простая вещь, которая заключается в объединении двух запросов и обработке их результатов, что-то вроде
forkJoin({ employees: this._employeeService.getAllemployee(), projects: this._projectService. getAllProjects()}).pipe(map(({ employees, projects }) => {... do your transformations here ... }))
. Но тогда без.subscribe()
звонков в службу. Я бы поспорил, что вам не нужны все эти сложности, объекты поведения и возврат подписок.4. Похоже, в вашем коде на базовом rxjs lvl много ошибок: А) Ваш
getAllEmpoyees
метод в настоящее время возвращает подписку, поэтому вы никогда не увидите данные за ее пределами. B) все это сопоставление кажется в высшей степени неуместным, поскольку большинство, если не все поля имеют общее имя. пожалуйста, постарайтесь предоставить только ту часть, которая интересна для вашей проблемы, и убрать абстрактные вещи, которые вряд ли вызовут проблему, чтобы люди могли сосредоточиться на проблеме, а не на стене текста 😉5. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.