ANGULAR RXJS : запустите два объекта поведения, верните неиспользованный

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