Как бороться с наблюдаемой каскадной - PullRequest
0 голосов
/ 14 июня 2019

Мне сложно понять, как все работает с наблюдаемыми.Я разрабатываю API, который получает «Person», у которого будет несколько свойств и два «Parent».Я извлекаю эти объекты с помощью модуля mssql, который возвращает наблюдаемые.Моя проблема в том, что когда я получаю Observable, я не могу получить объект «Parent» для заполнения «Person» (как я получаю другой Observable), который возвращает моя функция.

IЯ понял, что оператор карты позволяет мне редактировать выдаваемое значение, заполняя поля родителей с помощью идентификатора человека.Но кажется, что два Observable не могут быть подписаны в операторе карты: моя функция возвращает Observable, не дожидаясь заполнения родителей.

return this.SQLService.GetPerson().pipe(
  map((p: any): Person => {
    // This fills the Person object from the db returned object
    let returnValue = new Person(p);
    this.SQLService.GetParent(returnValue.ID).pipe(
      map((parentObj: any): Parent => { return new Parent(parentObj); })
    ).subscribe(
      (parentInstance: Parent): void => {returnValue.Parent1 = parentInstance;}
    );
  return returnValue;
})

Исходя из синхронной разработки, я ожидаю, что мое returnValue будет фактическивернуть Person с полем Person.Parent1, содержащим родителя.В конце концов, я могу получить человека, но без поля Parent1.(и без сообщения об ошибке)

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Извините, у меня пока нет 50 репутации, чтобы комментировать ваше сообщение.Это не полный ответ, но я действительно хочу порекомендовать эту статью: https://medium.com/@shairez/a-super-ninja-trick-to-learn-rxjss-switchmap-mergemap-concatmap-and-exhaustmap-forever-88e178a75f1b

0 голосов
/ 14 июня 2019

Вы можете использовать switchMap здесь.

Затем, когда вы отобразите свой результат из GetParent, вы можете вернуть объект с ответом как GetParent, так и GetPerson.

return this.SQLService.GetPerson().pipe(
  switchMap((p: any): Person => {
    // This fills the Person object from the db returned object
    let returnValue = new Person(p);
    return this.SQLService.GetParent(returnValue.ID).pipe(
      map((parentObj: any): Parent => { return { parent: new Parent(parentObj), returnValue }; })
    );
  }),

).subscribe(({ parent, returnValue }): void => {returnValue.Parent1 = parentInstance;});
...