首页 > 解决方案 > 递归调用 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);
        });
}

标签: angularrecursionobservable

解决方案


我已经浏览了@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);
        });
}

推荐阅读