Обещания прекратить зацикливание, когда XMLHttpRequest Интернет выключен - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть код, который зацикливает 2 метода.

Метод 2 проверяет URL, используя XMLHttpRequest.

Проблема, с которой я сталкиваюсь, заключается в том, что когда Интернет активен, он продолжает цикл, но как только я выключаю Интернет, XMLHttpRequest завершится сбоем и прекратит цикл.

Вот код:

    one() {
        return new Promise(resolve=> {
            // Does something and returns either true or false
        })

    }

    two() {
        return new Promise(resolve => {
            const httpRequest = new XMLHttpRequest();
            httpRequest.open("GET", 'someurl', true);
            httpRequest.send();
            httpRequest.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                    resolve(this);
                }
            };
        })
    }

    loop() {
        setTimeout(() => {
            this.one()
                .then(()=>this.two().then(response => {
                    if (response.status === 200) {
                        // Its True
                    } else {
                        // Its False
                    }
                }))
                .then(()=>this.loop())
        }, 5000);
    }

}

Как я могу сделать так, чтобы он продолжал цикл, несмотря ни на что?

1 Ответ

0 голосов
/ 13 сентября 2018

Попробуйте добавить обработчик ошибки

       httpRequest.onerror = function() {
           resolve({ error: true });
       };

Также вы можете выбросить и поймать ошибку

two() {
    return new Promise((resolve, reject) {
       // ...
       httpRequest.onerror = function() {
           reject();
       };
    });
}

loop() {
    setTimeout(() => {
        this.one()
            .then(()=>this.two()
            // ...
            .then(() => this.loop())
            .catch(() => this.loop())
    }, 5000);
}

Второй подход позволяет немедленно прервать цепочку обещаний, это может быть полезно, если у вас есть методы three, four и т. Д.

...