Если я правильно понимаю, вам нужно сначала завершить все операции fileupload перед сохранением документа, который должен содержать все id
s, возвращаемые загрузка файла операций.
Я также предполагаю, что this.attachments
- это какой-то массив, содержащий имена вложений.
Если все это правда, я будет действовать следующим образом.
Сначала я бы создал массив Observables, каждый из которых представляет http-вызов, который вы хотите сделать, чтобы сохранить вложение и получить его id
в качестве ответа
const saveAttachments = this.attachments).map(
file => this.http.post<Attachement>(`${this.addAttUrl}`, file),
);
Затем вы можете выполнить все эти наблюдаемые параллельно, используя forkJoin
, например,
forkJoin(saveAttachments)
, который возвращает Observable, который излучает, когда все наблюдаемые, переданные как параметр в массиве saveAttachments
, завершены. Испускаемое значение представляет собой массив со всеми возвращенными id
s.
Теперь вы можете выполнить последнюю операцию, то есть сохранить досье, объединив savedossier$
наблюдаемое с тем, что было возвращено forkJoin
. Окончательный код будет выглядеть так:
const saveAttachments = this.attachments).map(
file => this.http.post<Attachement>(`${this.addAttUrl}`, file),
);
forkJoin(saveAttachment).pipe(
concatMap(ids => {
this.dossier.attachments.push(data);
return this.http.post<Dossier>(`${this.adddossierUrl}`, this.dossier);
})
)
Обратите внимание, что вы должны использовать оператор concatMap
, чтобы указать, что вы хотите выполнить наблюдаемое, возвращаемое функцией, переданной в качестве параметра в concatMap
после предыдущее наблюдаемое, то есть возвращаемое forkJoin
, завершено.
Если вы хотите увидеть некоторые шаблоны того, как использовать Observables для составления http-вызовов в различных случаях использования, это статья может быть интересна .