我正在尝试POST
在所有文件上传后提出请求。在我的 Web 表单中,用户可以添加许多要上传的文件。我有两个处理我的请求的 API。
我的一个 APIfileupload
将文件保存在数据库中并返回一个 id(文档 ID),第二个 API 保存档案。在调用savedossier
API 之前,我必须将所有文档 ID 添加到档案对象。
我用mergeMap上传文件:
const fileupload$ = from(this.attachments).pipe(
mergeMap(file => this.http.post<Attachement>(`${this.addAttUrl}`, file)),
);
fileupload$.subscribe(
(data) => this.dossier.attachments.push(data),
(err) => console.error('err: ' + err)
);
const savedossier$ = this.http.post<Dossier>(`${this.adddossierUrl}`, this.dossier);
savedossier$.subscribe(
(data) => console.log('Dossier saved!'),
(err) => console.error('err: ' + err)
);
我的问题是第二次调用 (to savedossier$
) 不会等到所有文件都上传完毕(因为它是异步的)。因此,文档 ID 不会添加到我的档案对象中。
我用这样的“丑陋”解决方案进行了测试:
const fileupload$ = from(this.attachments).pipe(
mergeMap(file => this.http.post<Attachement>(`${this.addAttUrl}`, file)),
);
fileupload$.subscribe(
(data) => onuploaded(data),
(err) => console.error('err: ' + err)
);
onuploaded(data) {
this.dossier.attachments.push(data)
if (this.dossier.attachments.length === this.attachments.length) {
savedossier$.subscribe(
(data) => console.log('Dossier saved!'),
(err) => console.error('err: ' + err)
);
}
}
const savedossier$ = this.http.post<Dossier>(`${this.adddossierUrl}`, this.dossier);
带有比较数组长度的 if 语句的此解决方案有效。但我认为这不是推荐的方式。
rxjs 有更好的解决方案吗?