Загрузите файл один раз за цикл в Angular 6 - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь загрузить все выбранные файлы в Angular.Я создал сервис, который передает файл в виде данных формы некоторым API.

onFileSelected(event: EventEmitter<File[]>) {
    for (let i = 0; i < this.uploader.queue.length; i++) {

      this.uploadedPercentage = 0;
      let fileItem = this.uploader.queue[i]._file;
      let f: FileDetail = { file: null, status: "", comment: "", uploadDate: new Date };
      f.file = fileItem;
      f.status = "init";

      if (fileItem.size / 1024 / 1024 / 1024 <= 1) {
        this.uploadFile(f, i);
      }
      else {
        f.status = "error";
        f.comment = "Maximum 1GB is allowed";
        this.uploadedFiles.push(f);
      }
    }
  }

uploadFile(file: FileDetail, index: number) {
    let data = new FormData();
    data.append('file', file.file);
    data.append('filename', file.file.name);
    var httpSubscriber : Subscription = this.service.uploadFileData(data).subscribe((event: HttpEvent<any>) => {
      switch (event.type) {
        case HttpEventType.Sent:
          break;
        case HttpEventType.Response:
          file.status = "Uploaded";
          return true;
          break;
        case 1: {
          if (Math.round(this.uploadedPercentage) !== Math.round(event['loaded'] / event['total'] * 100)) {
            this.uploadedPercentage = event['loaded'] / event['total'] * 100;
          }
          file.status = "Uploading";
          break;
        }
      }
    });
  }

Проблема: я хочу загрузить файл один за другим и показать прогресс каждого файла.если вы видите здесь в моем примере, я взял цикл loop для загрузки всех файлов и вызвал метод this.uploadFile, который фактически конвертирует файл в multipart и службу вызова.но поскольку это асинхронный метод, он не ожидает ответа (очевидно) и начинает загружать файлы все вместе.Я хочу загрузить этот файл один за другим и показать прогресс каждого элемента.

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете использовать async/await для ожидания Observable до конца.

Сначала создайте uploadFile метод async.Затем await операция uploadFileData для завершения.Обратите внимание, что uploadFileData observable преобразуется в Promise.

onFileSelected(event: EventEmitter<File[]>) {
    for (let i = 0; i < this.uploader.queue.length; i++) {
         ...

      if (fileItem.size / 1024 / 1024 / 1024 <= 1) {
        this.uploadFile(f, i);
      }

      ...

    }
  }

async uploadFile(file: FileDetail, index: number) {
    ...

    await this.service.uploadFileData(data).toPromise().then((event: HttpEvent<any>) => {
      switch (event.type) {
        ...
      }
    });
  }

Небольшой проект стекаблиц, который я создал здесь: https://stackblitz.com/edit/angular-pmbbfx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...