добавить дополнительный параметр к наблюдаемому ответу - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть следующий код

    getFileAsync(fieldFiles: Array<FileFields>): Observable<Array<UploadFile>> {
        const files = Array<UploadFile>();
        const downloads = Array<Observable<any>>();
        fieldFiles.forEach(file => {
            downloads.push(FileHelper.downloadFile(file.file_id));
        });
        forkJoin(downloads).subscribe({
            next: filesData => {
                console.log(filesData)
                fieldFiles.forEach((file, index) => {
                    const fileData = filesData[index];
                    files.push({
                        uid: file.file_id,
                        name: file.filename,
                        url: fileData ? window.URL.createObjectURL(new Blob([fileData.data], {type: file.contentType})) : require('../../../assets/images/file.png'),
                        size: file.size,
                        type: file.contentType,
                    })
                })
            },
            error: () => {}
        });
    }

По сути, у меня есть список файлов, и я хотел бы загрузить их один за другим:

Я использую FileHelper.downloadFile, которые возвращаютhttp observable

        const downloads = Array<Observable<any>>();
        fieldFiles.forEach(file => {
            downloads.push(FileHelper.downloadFile(file.file_id));
        });

Затем я использую forkJoin (загрузки), чтобы отправить запрос и получить ответы. Но я хотел бы вместо этого использовать concatMap и загружать файл по одному.

Но проблема в том, что запрос http не возвращает идентификатор файла, поэтому мне нужен способ узнать, что это за идентификатор. в настоящее время тот, который загружается. Примерно так:

        const downloads = Array<Observable<any>>();
        fieldFiles.forEach(file => {
            const fileId = file.file_id;
            downloads.push(FileHelper.downloadFile(fileId));
        });
        concatMap(downloads).subscribe({
            next: (filesData, fileId) => {}

Есть ли способ добавить эту переменную и «связать» ее с наблюдаемой http-запроса?

1 Ответ

1 голос
/ 21 ноября 2019

Вы можете использовать оператор карты в Observable, чтобы преобразовать его в объект с идентификатором и данными. Как то так:

    const downloads = Array<Observable<any>>();
    fieldFiles.forEach(file => {
        const fileId = file.file_id;
        downloads.push(FileHelper.downloadFile(fileId).map((x) => ({ id: fileId, data: x}));
    });
    concatMap(downloads).subscribe({
        next: (x) => { 
           // x.data 
           // x.id
         });
...