Удаление тайм-аута Fetch API по умолчанию - PullRequest
0 голосов
/ 22 мая 2018

Я отправляю запросы на свой сервер, используя собственную выборку из Google Chrome или Mozilla Firefox:

fetch(url, {
  method: 'POST',
  body: formData,
  credentials: 'include'
})

Я настроил сервер для отправки ответа через 3 минуты и понял, что оба браузера ждут только 2минут.Firefox повторно отправляет запрос еще раз, прежде чем завершится неудачей.

Есть ли способ определить время ожидания более 2 минут (скажем, бесконечное)?

Ответы [ 3 ]

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

Я прибег к

async function fetchJSON(url: string, data: any = {}, method: string = "POST"): Promise<any> {
    const start = new Date().getSeconds();

    while (new Date().getSeconds() - start < 10) {
        try {
            const res = await fetch(url, {
                method,
                headers: {
                    "Content-Type": "application/json; charset=utf-8"
                },
                body: JSON.stringify(data)
            });

            try {
                return await res.json();
            } catch (e) {
                if (res.status < 400) {
                    return res.status;
                } else {
                    throw e;
                }
            }
        } catch (e) {
            await new Promise((resolve) => {
                setTimeout(resolve, 1000);
            })
        }
    }
}

, то есть время ожидания составляет 10 секунд.

0 голосов
/ 11 августа 2019

Чтобы сделать тайм-аут "бесконечным", я использую это:

fetch (serverUrl)
.then
( resp  => resp.json()
)
.then
( json => $cback (json)
)
.catch
( e    => $cback (e)
);

'$ cback' - это видимая функция обратного вызова в области видимости, которая определяет, является ли ее 1-й аргумент экземпляром Error.Если это так, он сделает новый вызов fetch ().Если он НЕ обнаруживает, что это ошибка, он использует ответ для того, для чего он был предназначен, а затем делает новый вызов для извлечения.

Кажется, это прекрасно работает в FireFox.Выборка не делает тайм-аут, что я и хочу.К сожалению, в Chrome fetch () ВСЕГДА истекает примерно через 2 минуты, что приводит к срабатыванию оператора catch, другими словами, время ожидания считается ошибкой.Но я улавливаю это.

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

0 голосов
/ 22 мая 2018

Насколько я читаю документацию fetch () по MDN, он не может указать время ожидания.

Вы можете использовать request или axios *Модуль 1006 *, если вы используете nodejs.или вы можете использовать XMLHttpRequest (обычный javascript в браузере).

Для получения дополнительной информации Тайм-аут HTTP-запроса в JavaScript

...