Как я могу запустить еще один запрос после AbortController.abort ()? - PullRequest
0 голосов
/ 28 июня 2018

Я читал об отмене запросов на выборку с помощью AbortController.abort () . Есть ли способ снова запустить запрос, не прерывая его после вызова этой команды?

Например, в это демо из MDN , один раз Отмена загрузки была нажата, щелкнув Загрузка видео снова запустит выборку, но сразу прервет ее .

Есть ли способ снова разрешить этот запрос, не прерывая его? Итак, в этом случае, как вы можете нажать Загрузить видео , чтобы начать загрузку, нажмите Отменить загрузку , чтобы отменить загрузку, а затем нажмите Загрузить видео снова, чтобы начать загрузку снова? Например, если пользователь нажал Отменить загрузку при аварии ...

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Например, в этой демонстрации из MDN после нажатия кнопки «Отменить загрузку» нажатие кнопки «Загрузить видео» снова вызовет выборку, но немедленно прервет ее.

Они исправили пример . После нажатия Cancel download вы сможете начать новую загрузку и отменить ее снова, снова и снова. Чтобы добиться этого, Download button каждый раз создает новый AbortController , так что вы получаете свежий сигнал для прерывания каждый раз:

downloadBtn.addEventListener('click', fetchVideo);

function fetchVideo() {
  controller = new AbortController;
  signal = controller.signal;
  // ...

Так что можно создавать новые AbortControllers для каждого запроса, который вы можете отменить.

0 голосов
/ 06 июня 2019

Я знаю, что это может быть довольно поздно, но я все равно оставляю этот ответ на тот случай, если кому-то это понадобится.

Я не знаю, является ли это наиболее оптимальным подходом, но для того, чтобы продолжать делать запросы на выборку (с «одинаковым» сигналом), мне пришлось создавать новый экземпляр AbortController для каждого запроса.

В моем случае (весь код содержится в объявлении класса) я каждый раз удалял и создавал новый экземпляр, например, так:

class Foo Extends Bar {

    abort_controller_instance = false;

    constructor(params){
        super(params);
        this.resetOrStartAbortController();
    }

    resetOrStartAbortController(){
        if(this.abort_controller_instance){
            delete this.abort_controller_instance;
        }
        this.abort_controller_instance = new AbortController();
    }

    abortFetchRequest(){
        if(this.abort_controller_instance){
            this.abort_controller_instance.abort();
            this.resetOrStartAbortController();
        }
    }

    ...

}

Возможно, это не самое элегантное решение, но оно работает.

Привет!

...