Подписка вызывается случайным числом раз за цикл в Angular 6 - PullRequest
0 голосов
/ 25 апреля 2019

Я экспортирую два (или несколько) файлов в XML.Для этого я написал код на C # для извлечения данных из серверной части и экспорта их в файл XML.Впервые после загрузки страницы, если я экспортирую несколько файлов, она экспортируется правильно, но без перезагрузки страницы, если я пытаюсь экспортировать несколько файлов, она экспортирует случайное число выбранных файлов с правильными данными.Все происходит в "петле".Я искал решения, но не нашел.Мало кто говорит отказаться от подписки, мало кто говорит, что нужно использовать fork join.Я пытался, но ничего не работает для меня.Я не уверен, где именно мой код неверен.Кто-нибудь может мне помочь.

Ниже мой код:

onExport(event: Event): void {
    const selectedRecord = Object.assign({}, this.selection.selected);
    console.log(selectedRecord, 'Sample selectedData');
    var SampleIds = { Ids: [] }
    for (var i = 0; i < this.selection.selected.length; i++) {
      SampleIds.Ids.push(this.selection.selected[i].id);
    }
    this.getSampleById(SampleIds.Ids);
}

fileNames = [];
  getSampleById(ids: string[]) {
    this.sampleService.getById(ids)
      .subscribe(data => {
        this.selectedSample = Object.assign([], data);
        const url = environment.api_url_sample + 'Sample/ExportSample/';
        this.selectedSample.forEach(element => {
          const date = new Date();
          this.fileName = element.name + '_' + date.getUTCFullYear() + '-' + date.getUTCMonth() + '-' + date.getUTCDate();
          this.fileNames.push(this.fileName)
          var downloadData;
          console.log(this.fileNames, 'first downloadData')

          this.httpClient.post(url, element, { responseType: 'text' }).subscribe((data) => {

            downloadData = data;
            console.log(data, 'second downloadData')

            const binaryData = [];
            binaryData.push(downloadData);
            const downloadURL = window.URL.createObjectURL(new Blob(binaryData, { type: 'application/xml' }));
            const link = document.createElement('a');
            link.href = downloadURL;
            console.log(this.fileNames,'inside subscribe');
            link.download = element.name + '.xml';
            link.click();
          },
            error => { alert(error.message); }
          );
        }); 
      }, err => {
        alert("Error in getSampleById")
      });
  }

Ниже мой сервис, который я вызываю вышеупомянутым методом:

getById(ids : string[]): BehaviorSubject<Sample[]> {
    var sampleIds =
    {
      Ids : ids
    }
    this.apiService.post(environment.api_url_sample, 'sample/GetSamples',sampleIds)
        .subscribe(data => {
          this.selectedSample = data;
          this.selectedSampleSubject.next(this.selectedSample);
        });
    return this.selectedSampleSubject;
  }

Ниже мой C #код с использованием .Net Core:

        [HttpPost]
        [Route("ExportSample")]
        public async Task<IActionResult> ExportToXml(ResponseSampleDto responseSampleDto)
        {

            List<SummaryDto> Summary = await _measurementValueService.GetMeasurementValuesForExport(responseSampleDto.Id);
            SampleExportDto sampleExportDto = Mapper.Map<SampleExportDto>(responseSampleDto);
            sampleExportDto.Summary = Summary;
            Guid userId = GetCurrentUserId();
            var userDetails = await _userService.GetByIdAsync(userId);
            sampleExportDto.Sample.UpdatedbyName = userDetails.FirstName + " " + userDetails.LastName;
            System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(sampleExportDto.GetType());
            MemoryStream memStream = new MemoryStream();
            writer.Serialize(memStream, sampleExportDto);
            memStream.Position = 0;
            return File(memStream, "application/octet-stream");
        }

Кто-нибудь может мне помочь в этом?

...