Typescript - blokada przycisku po wykonaniu akcji pobierania

0

Cześć, mam następującą sytuację: próbuję rozpocząć pobieranie pliku (FileSave.saveAs), po czym po trzech sekundach zmienić przycisk kontrolki odpowiedzialnej za pobieranie z powrotem na aktywny przez usunięcie z niej odpowiedniej klasy (this.commonFileService.updateLinkStylesWhenDownloadInProcess). Problem w tym, że akcja pobierania rozpoczyna się dopiero po wykonaniu akcji finalize(), po drugie, i tak nie po trzech sekundach - tak jakby to w ogóle nie działało. Prosiłbym o pomoc.

this.commonFileService.downloadFile(blobFileRoute, FileContainerType.Slot)
	.pipe(finalize(() => {
		this.commonFileService.updateLinkStylesWhenDownloadInProcess(downloadFileLink);
	}), tap(async response => {
		FileSaver.saveAs(response.body, title);
		await delay(AppConsts.DownloadButtonDisabledTime);
	}, error => {
		this.messageService.error(error.message);
	})).subscribe();
1

korzystasz z Rx.js? (nie piszesz nic o tym, ale to wygląda jak Rx.js).

 tap(async response => {
        FileSaver.saveAs(response.body, title);
        await delay(AppConsts.DownloadButtonDisabledTime);
    },

Niby używasz Rx i pipe, ale i tak próbujesz pisać imperatywnie zamiast skorzystać z kompozycji operatorów. Pipe robi taki rurociąg, więc możesz wyciągnąć sobie delay o np. tak:

this.commonFileService.downloadFile(blobFileRoute, FileContainerType.Slot)
    .pipe(
        tap(
            async response => {
                FileSaver.saveAs(response.body, title);
            }, error => {
                this.messageService.error(error.message);
            }
        ),
        delay(AppConsts.DownloadButtonDisabledTime),
        // finalize przeniosłem na koniec, bo inaczej to rozwiązanie nie będzie działać:
        finalize(() => {
            this.commonFileService.updateLinkStylesWhenDownloadInProcess(downloadFileLink);
        }), 
    ).subscribe();

Swoją drogą dlaczego 3 sekundy? Dlaczego nie sprawdzisz kiedy faktycznie się plik pobrał? Skąd wiadomo, czy się nie załaduje po pół sekundy? Albo po 10 sekundach? Ta biblioteka FileSaver której używasz nie daje ci jakiegoś callbacku/promise'a, żeby cię poinformować, kiedy się pobrało?

0

Nie specjalnie wiem, co tu się dzieje, ale jeżeli delay działa na setTimeout, to wiedz, że on nie gwarantuję 3 sekund. Gwarantuje, że coś nie odpali się wcześniej niż za 3 sekundy, ale może się odpalić i za 10, albo wcale, jak Ci coś przyblokuje stos.

1 użytkowników online, w tym zalogowanych: 0, gości: 1