Как реализовать метод отмены нескольких загрузок, выполняемых с помощью Promise.all () - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть Promise.all(), который возвращается, когда все мои обещания о загрузке завершены, загрузки в основном состоят из нескольких изображений и выполняются с помощью Cordova FileTransfer . Я пытаюсь добавить возможность отменить оставшиеся загрузки в списке URL-адресов, который передается на Promise.all(). Я попробовал несколько способов сделать это, но все равно всегда загружаются остальные элементы.

Как мой код прямо сейчас:

async downloadFunction(arrayToDownload: Object[]): Promise<void[]> {
    let loading = await this.loadingController.create({
        message: 'Touch backgroud to cancel',
        backdropDismiss: true
    });
    await loading.present();

    const fileTransfer: FileTransferObject = this.transfer.create();
    let canceled: boolean = false;

    loading.onDidDismiss().then(obj => {
        console.log(obj); // obj.role will be = 'backdrop' if clicked in background
        if (obj.role === 'backdrop') {
            console.log('canceled');
            //fileTransfer.abort(); -> Tried to abort filetransfer here first, but it seems that it need to be fired during download.
            canceled = true;
            return;
        }
    }); 

    return Promise.all(arrayToDownload.map(element => {
        if (canceled === true) {
            return; // Added a return here, so it would skip the rest, but didn't work                  
        }

        if (element != undefined) {
            // Get data from URL and do other preparations
            //...

            return fileTransfer.download(encodedURI, this.file.externalDataDirectory + 'randomFolder').then(entry => {
                return;

            }, error => {
                console.log("Error while downloading image: ", error);
                return;     
            }).catch(error => {
                console.log("Error while downloading image: ", error);
                return;
            }); 
        } else {
            throw new Error("image url not available");                 
        }

    })).then(() => {
        loading.dismiss();
        return [];
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...