как обрабатывать несколько вложенных подписок - PullRequest
0 голосов
/ 04 июля 2019

я хочу получить параметр id из маршрута затем получить задачу с этим затем выберите родителя для родителя задачи, если он имеет один

    Angular CLI: 7.1.4
    Node: 11.6.0
    OS: linux x64
    Angular: 7.1.4
    @angular-devkit/architect         0.11.4
    @angular-devkit/build-angular     0.11.4
    @angular-devkit/build-optimizer   0.11.4
    @angular-devkit/build-webpack     0.11.4
    @angular-devkit/core              7.1.4
    @angular-devkit/schematics        7.1.4
    @ngtools/webpack                  7.1.4
    @schematics/angular               7.1.4
    @schematics/update                0.11.4
    rxjs                              6.3.3
    typescript                        3.1.6
    webpack                           4.23.1

Служба задач:

    import { ITask } from '@task/interfaces/task';
    ...
    export class TaskService {
      constructor(private _http: HttpClient) {}
    ...
      get_task(id: number) {
        return this._http.get<ITask>(\`http://127.0.0.1:8000/api/task/${id}\`);
      }

в моем компоненте:
для получения одной задачи у alredy есть 2 подписчика


    this._route.params.subscribe((params: Params) => {
      this._task_service
        .get_task(params['id'])
        .subscribe(
          (data: ITask) => { this.task = data; },
          err => { this._log.log('error while fetching task ', err); }
        );
    });

Я хочу

this._route.params   
get_task(params['id'])
if `task.parent` get parent task 

Я читал много часов и получал ошибки при каждом попытке
flatMap().subscribe(...) // Тип «Подписка» нельзя назначить типу «ObservableInput <{}>»

Я читаю много постов в интернете, но не понимаю
Может кто-нибудь объяснить и показать мне пример, как я могу этого достичь?

обновление

console.log( 
  'type ',
   typeof this._task_service.get_task(2),
   this._task_service.get_task(2)
);

я понял

type  object 
{…}
​_isScalar: false
​operator: {…}
  project: function request()
​​  thisArg: undefined
​​  __proto__: Object { call: call(), … }
​source: {…}
  ​​_isScalar: false
  ​​operator: {…}
    ​​​predicate: function
./node_modules/@angular/common/fesm5/http.js/HttpClient.prototype.request/res$<()
    ​​​thisArg: undefined
    ​​​__proto__: Object { call: call(), … }
​​    source: Object { _isScalar: false, source: {…}, operator: {…} }
    ​​__proto__: Object { lift: lift(), subscribe: subscribe(), _trySubscribe: 
  d_trySubscribe(), … }
__proto__: Object { lift: lift(), subscribe: subscribe(), _trySubscribe: _trySubscribe(), … }

1 Ответ

0 голосов
/ 04 июля 2019

это должно сработать, дайте мне знать, я не могу проверить ваш код

const subscription = this._route.params.pipe(
  switchMap((params: Params) => combineLatest([
    this._task_service.parentFetchRequest(), // change with your parent fetch request 
    this._task_service.get_task(params['id'])
    ])
  )
  .subscribe(
    ([dataOfParent : ParentType, data: ITask]) => { 
      this.task = data; 
      this.parentTask = dataOfParent
      },
    err => { this._log.log('error while fetching task ', err); }
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...