Как я могу вызвать функцию API последовательно для всех элементов массива?

Я работаю с Angular, используя RxJ, и в 9X_.js настоящее время мне очень сложно решить 9X_vanilla-javascript эту проблему.

У меня есть массив, содержащий 9X_rxjs идентификаторы.

ids = [1,2,3,4]

Затем у меня есть API, который 9X_rxjs можно вызвать с параметром id, который удаляет 9X_angular4.x элемент с заданным id из базы данных:

this.controller.deleteItem(id)

Я хочу 9X_rxjs вызывать этот API для каждого идентификатора 9X_angularjs2 в массиве.

Эти вызовы API должны строго выполняться 9X_javascript один за другим в последовательном порядке, например

this.controller.deleteItem(1) -> this.controller.deleteItem(2) и 9X_angular4 т. д.

После завершения всех вызовов API я 9X_angular хотел бы получить данные с помощью:

this.controller.getData()

Как я 9X_vanilla-javascript могу решить эту проблему?

2
0
2
Общее количество ответов: 2

Ответ #1

Ответ на вопрос: Как я могу вызвать функцию API последовательно для всех элементов массива?

Вы можете сделать это с помощью оператора 9X_.js concat.

Сначала вам нужно превратить список идентификаторов 9X_angular в список наблюдаемых, сопоставив каждый 9X_javascript элемент массива с соответствующим действием 9X_angular4 удаления:

const idsToDelete = [1, 2, 3];
const deleteTasks = idsToDelete.map(id => this.controller.deleteItem(id));

Затем используйте concat для последовательного 9X_angular выполнения задач:

concat(...deleteTasks).subscribe((response) => {
  console.log('deleted', response);
});

Для получения данных в 9X_angular4 конце (при условии, что метод getData также возвращает 9X_vanilla-javascript наблюдаемое) вы можете вставить его в конце, после 9X_angular2 удаления, и только слушать ответ last:

concat(...deleteTasks, this.controller.getData()).pipe(
  // tap((res) => console.log(res)),
  last()
).subscribe((dataAfterDelete) => {
  console.log(dataAfterDelete);
});

Вы также 9X_ecmascript можете разделить эти вызовы, если хотите 9X_rxjs получить возможность выполнять побочные 9X_reactive-extensions-js эффекты между операциями удаления и извлечения 9X_reactive-extensions-js данных, используя оператор switchMap:

const sequentialDelete = concat(...deleteTasks);
sequentialDelete.pipe(
  tap((deleteItemResponse) => {
    console.log('after each item delete', deleteItemResponse);
  }),
  last(),
  tap(() => {
    console.log('after the last item was deleted');
    this.idsToDelete = [];
  }),
  switchMap(() => this.controller.getData())
).subscribe((dataAfterDelete) => {
  console.log(dataAfterDelete);
});

11
0

Ответ #2

Ответ на вопрос: Как я могу вызвать функцию API последовательно для всех элементов массива?

Простым способом RxJS (предполагается, что 9X_angular обе функции контроллера возвращают Observables)

concat(
 from(ids).pipe(concatMap(id=> this.controller.deleteItem(id))),
 this.controller.getData()
)

2
0