Вызывать наблюдаемые синхронно один за другим в Angular - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующие сервисные звонки:
productService.GetAllProducts ()
productService.DeleteProduct ()
productService.GetCategories ()
productService.DeleteCategory ()

В коде sudo мне нужно сделать следующее в моем компоненте:

  1. Получить список продуктов, используя productService.GetAllProducts ().

  2. Просмотрите список продуктов и вызовите productService.DeleteProduct () для каждого продукта.

  3. Как только я смогу подтвердить, что все вышеперечисленные удаления завершены (из-за ограничений в БД), мне нужно получить список категорий, используя productService.GetCategories (). Просмотрите каждую категорию и вызовите productService.DeleteCategory ().

Я знаю, что моя жизнь была бы намного проще, если бы у меня были более качественные внутренние вызовы для массового удаления, но в этом случае у меня нет выбора. Мне нужно следовать порядку получения списка, его циклического просмотра, отдельного удаления каждого элемента.

Возможно ли вообще делать то, что я пытаюсь сделать, используя flatMap и наблюдаемый полный параметр? Моя самая большая проблема - знать, когда код завершит удаление всех продуктов перед поиском и удалением всех категорий.

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете попробовать что-то в этом духе

productService.GetAllProducts()
.switchMap(
   products => forkJoin(products.map(product => productService.DeleteProduct(product)))
)
.switchMap(() => productService.GetCategories())
.switchMap(
   categories => forkJoin(categories.map(category => productService.DeleteCategory(category)))
)
.subscribe(() => console.log('done'))

Вся идея в следующем

  • GetAllProducts возвращает массив продуктов, который передается как параметр до первого switchMap
  • Массив Products преобразуется через map в массив Наблюдаемые, которые являются результатом DeleteProduct - массив Наблюдаемый передается первому forkJoin как его параметр
  • forkJoin испускается, когда все наблюдаемые, которые он получил как параметр завершен, и, следовательно, будет излучать, когда все продукты были удалены
  • То же рассуждение повторяется для категорий

Я не уверен, что код синтаксически совершенен, но этого должно быть достаточно, чтобы дать вам представление о том, как действовать.

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