2017-02-14 2 views
0

У меня есть этот кусок кода:Как «синхронизировать» наблюдаемые?

ngOnInit(): void 

     { 
this.categories = this.categoryService.getCategories(); 

      var example = this.categories.flatMap((categor) => categor.map((categories) => { 

      var links = this.categoryService.countCategoryLinks(categories.id) 
         .subscribe(valeur => console.log(valeur)); 
       return categories.id 
      })); 
    } 

Результат являются двумя наблюдаемыми. Один из них состоит из списка категорий. Второе - это количество элементов для определенных категорий category.id.

Мой вопрос состоит в следующем:

Как я мог бы получить всю эту информацию, структурированную в той или иной структуры данных? Я хотел бы сохранить категории и количество элементов для каждой категории в одной структуре данных, чтобы показать их в моем компоненте TS.

Я пошел шаг за шагом, пытаясь исправить свои проблемы, и я пошел, чтобы иметь следующий код, который почти раствор:

this.categories = this.categoryService.getCategories(); 
     var example = this.categories.mergeMap((categor) => categor.map((myCateg) => 
      { 
      this.categoryService.countCategoryLinks(myCateg.id) 
       .map(numlinks => Object.assign(myCateg,{numLinks: numlinks})) 
        .subscribe(valeur => console.log(valeur)); 
      return myCateg.id 
     })); 

Это дает следующий результат:

enter image description here

Где numLinks все еще объект ... (содержащий значение моего счета) Любая идея о том, как преобразовать его в свойство json, например categoryName или id?

Заранее спасибо и С уважением,

Здесь вы решение проблемы:

ngOnInit(): void 
{ 
    this.categories = this.categoryService.getCategories(); 
    const example = this.categories 
     .mergeMap((categor) => categor 
      .map((myCateg) => { 
     this.categoryService.countCategoryLinks(myCateg.id) 
      .map(numlinks => { 
       myCateg.numlinks = numlinks.count; 
       return myCateg; 
      }) 
       //Object.assign(myCateg,{numLinks: numlinks})) 
      .subscribe(value => console.log(value)); 
     return myCateg 
    })); 

      example.subscribe(val => console.log("value2: "+val)); 

} 

ответ

1

еще раз, решение приходит от оператора mergeMap(). :-)

this.categoryService.getCategories() 
    .mergeMap(val => val) // "Flatten" the categories array 
    .mergeMap(category => 
    this.categoryService.countCategoryLinks(category.id) 
     // Write the number of links on the `category` object 
     .map(numLinks => Object.assign(category, {numLinks: numLinks})) 
) 
    .toArray() 
    .subscribe(allCategoriesWithNumLinks => console.log(allCategoriesWithNumLinks)); 

Я не вдаваясь в специфику (первый mergeMap выравниваться массив, Object.assign() для получения конечного объекта), так как кажется, что мы покрыли все, что в предыдущей теме мы имели, но не стесняйтесь задавать вопросы, если что-то неясно.

вопросы Филиппа:

  • Почему Свести категории массив? Я предполагаю, что getCategories() испускает массив SINGLE, содержащий все категории. Поскольку вы хотите запускать HTTP-запрос для каждой категории, удобнее иметь видимое излучение каждой категории по отдельности. Вот что делает первый mergeMap(): он преобразует Observable<Category[]> в Observable<Category>.
  • Зачем нужен объект? Вы сказали, что хотите хранить все в одной и той же структуре данных. Вот что делает Object.assign: он записывает количество ссылок, найденных для каждой категории, на самом объекте category. Таким образом, вы получаете ОДИН объект, содержащий информацию из двух наблюдаемых (категория + numLinks).
+0

Это сообщение связано главным образом с моей нехваткой знаний об этой технологии и жаль об этом. Но почему мне нужно «сгладить» массив? Зачем создавать объект, так как мы работаем над Observables и можем использовать 2 источника для «объединения» в один (это только мнение). Разумеется, я понял, что Observables не являются обновляемыми. –

+0

Я уточнил свой ответ с более подробным объяснением. Вы должны попробовать посмотреть яйцо.io tutorials на RxJS, они действительно полезны. – AngularChef

+0

Благодарю вас @AngularFrance. Мне нужно будет убедиться, что я буду уверен. –

Смежные вопросы