Под катом, небольшая заметка о том, как приостановить выполнение вашего приложения при обрыве связи с интернетом и продолжить — когда она будет восстановлена.
Представим, что ваше, гипотетическое приложение, должно выполнить очередь http запросов. При чем каждый следующий зависит от результата предыдущего.
Но если посреди этого процесса пропадёт связь с интернетом, то очередь прервётся. Давайте исправим это.
Для начала напишем функцию, которая будет возвращать промис, который будет решатся, в момент, когда клиент возобновит соединение:
Теперь добавим её в наш основной код
Таким простым образом, при каждой итерации наш алгоритм будет проверять статус сети, и встанет на паузу если соединения не будет. И автоматически продолжит выполнение с того же места, как только связь будет восстановлена.
Конечно, это не панацея. Но такой, небольшой хак, сделает ваше приложение чуть более отказоустойчивым.
Представим, что ваше, гипотетическое приложение, должно выполнить очередь http запросов. При чем каждый следующий зависит от результата предыдущего.
async function main () {
let url = ' ... '
while (url) {
const resp = await fetch(url)
const json = await resp.json()
url = json.url
}
}
Но если посреди этого процесса пропадёт связь с интернетом, то очередь прервётся. Давайте исправим это.
Для начала напишем функцию, которая будет возвращать промис, который будет решатся, в момент, когда клиент возобновит соединение:
function awaitOnline () {
return new Promise(resolve => {
// Если клиент уже online — немедленно возвращаем результат
if (navigator.onLine) {
resolve()
return
}
// Регистрируем обработчик и решаем промис как только клиет будет online
window.addEventListener(
'online',
() => resolve(),
{once: true} // Автоматически удаляем обработчик после первого события
)
})
}
Теперь добавим её в наш основной код
async function main () {
let url = ' ... '
while (url) {
await awaitOnline() // Выполнение приостановится в этом месте до момента возобновления сети
const resp = await fetch(url)
const json = await resp.json()
url = json.url
}
}
Таким простым образом, при каждой итерации наш алгоритм будет проверять статус сети, и встанет на паузу если соединения не будет. И автоматически продолжит выполнение с того же места, как только связь будет восстановлена.
Конечно, это не панацея. Но такой, небольшой хак, сделает ваше приложение чуть более отказоустойчивым.