Обещания перестают зацикливаться, когда интернет xmlhttprequest отключен

У меня есть код, в котором используются 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);
    }

}

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

поменяйте свой if (this.readyState == 4 && this.status == 200) на if (true), я думаю

dustytrash 13.09.2018 20:40

Подумайте об этом, если Интернет отключен, XMLHTTPRequest не будет успешным. Таким образом, вам нужно будет отказаться от обещания об ошибке ...

epascarello 13.09.2018 20:54
0
2
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

       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 и т. д.

Другие вопросы по теме