Как я могу вызвать функцию 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 могу решить эту проблему?
Ответ #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); });
Ответ #2
Ответ на вопрос: Как я могу вызвать функцию API последовательно для всех элементов массива?
Простым способом RxJS (предполагается, что 9X_angular обе функции контроллера возвращают Observables)
concat( from(ids).pipe(concatMap(id=> this.controller.deleteItem(id))), this.controller.getData() )
-
4
-
8
-
3
-
22
-
3
-
9
-
1
-
3
-
3
-
3
-
4
-
6
-
4
-
2
-
6
-
2
-
2
-
4
-
4
-
1
-
5
-
6
-
3
-
2
-
7
-
3
-
1
-
8
-
4
-
3
-
5
-
2
-
2
-
10
-
3
-
3
-
1
-
1
-
2
-
2
-
2
-
3
-
2
-
2
-
1
-
1
-
1
-
1
-
1
-
2