Загрузить несколько файлов на сервер с помощью RxJ, при этом результат каждого ответа будет получен перед следующей итерацией

Я пытаюсь загрузить несколько файлов на сервер последовательно. Перед следующей итерацией мне нужен результат первой итерации. Я пробовал много решений с помощью RxJS, особенно с concatMap, но безуспешно.

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

private getDocumentData(files: any): void {
    this.myService.getDoc(this.id))
        .pipe(takeUntil(this.destroy$))
        .subscribe(document => {
        this.uploadMultipleFiles(document, files);
    });
}

async updateDoc(document: any, files: any) {
    for (let i = 0; i < files.length; i++) {
        let updatedDocObj = {
            ...document,
            file: {
                date: files[i].lastModified,
                fileName: files[i].name,
            },
        };
        const success = await this.myService.uploadMultipleFiles(
            updatedDocObj,files[i]);
    }
}

обновлено. происходит из другого метода, который получает информацию из API

gables20 05.06.2024 17:47
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вот подход только для rxjs, заключающийся в последовательном сохранении данных и использовании последних данных в следующем вызове?

export class Site7Component {
  private readonly data = [
    { id: 1, name: 'Max', value: 100 },
    { id: 2, name: 'Moritz', value: 200 },
    { id: 3, name: 'Franz', value: 300 },
  ];

  ngOnInit(): void {
    from(this.data)
      .pipe(
        concatMap((item) => this.saveData(item)),
        scan((acc, curr) => [...acc, this.doSth(acc, curr)], [] as any[])
      )
      .subscribe((result) => {
        console.info(result);
      });
  }

  private saveData(data: any): Observable<any> {
    return new Observable((observer) => {
      //place for the HTTP CALL
      setTimeout(() => {
        observer.next(data);
        observer.complete();
      }, 1000);
    });
  }

  private doSth(acc: any[], curr: any): any {
    console.info(acc);
    if (!acc || !acc[acc.length - 1]) {
      return curr;
    }
    return { ...curr, value: curr.value * (acc[acc.length - 1].id + 5) };
  }
}

Зачем использовать setTimeout? Что делать, если данные не сохранились в течение секунды?

gables20 07.06.2024 05:49

@ gables20 Timout — это просто моя версия асинхронного вызова. Вероятно, у вас там ОТДЫХ. Мне просто нужно было что-то, что «требует времени» в примере

Marlon 07.06.2024 07:10

Другие вопросы по теме