Как я могу вызвать функцию 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