angular - 递归调用 http.post 并在最后一次迭代中返回 observable
问题描述
我有要附加的文档列表,每个文档最多可以有 20 MB 的数据,用户可以附加任意数量的文件,因此我在每次休息呼叫时发送一个文件。
保存所有文档后,将用户重定向到 showStudent 页面。
这是我的代码,但问题是,它仅适用于单个文件。我想等到所有文件都保存下来。
uploadAttachments(student: Student, documents: Document[]): Observable<Response> {
let status;
let user = JSON.parse(localStorage.getItem('user'));
let userId = user.id;
let headers = new Headers({
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + localStorage.getItem('token')
});
let url = environment.userResourceEndpoint + userId + "/documents/attach";
let body;
let document = documents[index];
body = new FormData();
console.log("###############Uploading document:" + document.title);
let fileUpload: File = document.file;
body.append('attachTo', 'student');
body.append('attachToId', student.id);
body.append('title', document.title);
body.append('file', fileUpload, fileUpload.name);
return this.http.post(url, body, headers)
.map((res: Response) => {
res.json() as Student;
if (index < documents.length - 1) {
index = index + 1;
this.uploadAttachments(student, documents);
}
})
.catch((error: any) => {
if (error.status === 0) {
console.log(" Server is down???");
}
return Observable.throw(error);
});
}
解决方案
我已经浏览了@SourangshuSengupta 发给我的链接并实施了解决方案并且它有效。
以下是完整的方法代码供参考:
uploadAttachments(user: User, documents: Document[]): Observable<any> {
let status;
let observableObj = new Observable<Response>();
let user = JSON.parse(localStorage.getItem('user'));
let userId = user.id;
let headers = new Headers({
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + localStorage.getItem('token')
});
let url = environment.userResourceEndpoint + userId + "/documents/attach";
let body;
let observables = [];
documents.forEach(item => {
body = new FormData();
let fileUpload: File = item.file;
body.append('attachTo', 'user');
body.append('attachToId', user.id);
body.append('title', item.title);
body.append('file', fileUpload, fileUpload.name);
observables.push(this.http.post(url, body, headers).map(res => res.json()));
});
return Observable.forkJoin(observables)
.map(res => res.length)
.catch((error: any) => {
if (error.status === 0) {
console.log(" Server is down???");
}
return Observable.throw(error);
});
}
推荐阅读
- python - 类在 SQLalchemy 中没有名为“x”的映射列
- actions-on-google - 在 Google Home Mini 上测试 Google Action
- weather - 返回不同语言的雅虎天气数据
- html - 如何让引导下拉菜单在其父组件之外可见?角
- javascript - 用于自动幻灯片的 Javascript 代码在单独的 .js 文件中不起作用,但在 html 中起作用
- json - Apache Kafka 生产者 - 消费者 Web 服务
- github - 如何按功能搜索 github 项目?
- reactjs - “React 无法识别 DOM 元素上的 `classsName` 属性”
- loops - 在 Stata 中循环一组 reg3 模型
- neo4j - 尝试在 apoc.when() 中合并时出现 AUTH_DISABLED 警告