Как преобразовать результат нескольких подписок в объект Map? - PullRequest
0 голосов
/ 25 мая 2020

Я действительно борюсь с этой проблемой:

У меня есть string[], назовем его keys

Мне нужно l oop для каждого значения ключей и подписаться в сервис, чтобы получить список объектов. Я хочу Map<string, object[]>, поэтому на этой карте каждый ключ связан со списком объектов. Кроме того, мне нужно отсортировать object[] по имени, поэтому я попробовал это:

    let map =  new Map();
    keys.forEach(key => {
       this.getObjects(key).subscribe(objects => {
          map.set(key, objects.sort((a, b) => a.name - b.name));
       })
    });
    return map;

Но он не работает должным образом, как только появляется задержка в getObjects, мой компонент не получает полная карта. У вас есть подходящее решение?

1 Ответ

0 голосов
/ 25 мая 2020

не подписывайтесь на несколько ... используйте оператор более высокого порядка, например forkJoin ...

// forkjoin subscribes to all the observables you feed to it
return forkJoin(...keys.map(k => this.getObjects(k))).pipe(
  map(objects => { // this is all of the returned objects
    let mapUsages =  new Map();
    // do whatever in here, your code is unclear on what's happening here.
    objects.forEach(object => mapUsages.set(natureEmplacement.code, usages.sort((a, b) => a.name - b.name)))
    return mapUsages; // return your final value
  })
)

, тогда вызывающий функцию подписывается на возвращаемый наблюдаемый объект, который выдаст полную карту. Подписка является асинхронной, поэтому вы не можете вернуть карту синхронно, ожидая асинхронных значений для ее заполнения. Вы должны заполнить и вернуть его в асинхронном режиме c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...