Возможно ли иметь несколько невыполненных асинхронных запросов? - PullRequest
0 голосов
/ 25 июня 2019

Представьте себе сетку.Когда пользователь заполняет ячейку A1 и нажимает Enter, чтобы попасть в A2, запрос отправляется на сервер, чтобы что-то найти в базе данных, и возвращает результаты поиска обратно на сервер, чтобы заполнить оставшуюся строку A -- тем временем я хочу, чтобы пользователь мог продолжать печатать в A2, A3 и т. д.
Итак, вопрос:

  • Можете ли вы иметь несколько невыполненных асинхронных запросов, которые запускаютсяодин за другим, хотя результаты предыдущих запросов
    еще не разрешены?Или каждый последующий асинхронный запрос
    как-то отменяет предыдущий запрос?
  • База данных, которую я бью, - это корпоративное хранилище данных - я думаю, что это очень медленно.Есть ли предел тому, как долго асинхронный запрос может оставаться «открытым»?Время ожидания браузеров?
  • Наконец, допустим, я отправляю асинхронные запросы # 1, # 2 и
    # 3 - но на них получают ответы в # 2, # 3, # 1порядок - есть ли к этому какие-либо последствия?

Спасибо

Ответы [ 3 ]

2 голосов
/ 25 июня 2019

Можете ли вы иметь несколько невыполненных асинхронных запросов, которые запускаются один за другим, несмотря на результаты предыдущих запросов еще не решены?

Да.

Или каждый последующий асинхронный запрос как-то отменяет предыдущий запрос?

Количество

База данных, которую я бью, - это корпоративное хранилище данных - я думаю, что оно очень медленное. Есть ли предел тому, как долго асинхронный запрос может оставаться «открытым»? У браузеров истекло время ожидания?

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

Наконец, допустим, я отправляю асинхронные запросы № 1, № 2 и № 3 - но на них получают ответы в порядке № 2, № 3, № 1 - есть ли какие-либо последствия для этого?

С большинством API-интерфейсов (XMLHttpRequest, fetch и т. Д.) Вы получите обратные вызовы завершения в порядке выполнения операций, а не в порядке запускаемых операций , который действительно может иметь последствия, если ваш код не настроен для этого.


Например, этот код в jsFiddle показывает три перекрывающихся невыполненных запроса, выполняющихся в случайном порядке:

function doRequest(reqnum, reqdata) {
    const delay = (1000 + Math.floor(Math.random() * 3000)) / 1000;
    const json = JSON.stringify({data: reqdata});
    return fetch("/echo/json/", {
        method: "POST",
        body: `delay=${delay}&json=${encodeURIComponent(json)}`
    })
    .then(res => {
        if (!res.ok) {
            throw new Error("HTTP status " + res.status);
        }
        return res.json();
    })
    .then(data => {
        console.log(`${reqnum} complete, data = ${data.data}`);
    });
}

doRequest(1, "one");
doRequest(2, "two");
doRequest(3, "three");

Живой пример

2 голосов
/ 25 июня 2019

Чтобы ответить на ваши вопросы по порядку:

  1. Да, вы можете определенно иметь несколько HTTP requests одновременно.Рассмотрим пример веб-страницы.При открытии любой веб-страницы несколько запросов отправляются в несколько мест.Когда они разрешены, определенные на них значения callback methods продолжают заполнять данные на веб-странице.

  2. Да, определенно.Запрос будет timeout через некоторое время.Каждый браузер имеет default timeout duration, для которого он сохраняет запрос открытым.По истечении этого времени он отменяет запрос.

  3. Не имеет значения, в каком порядке они разрешаются.Вы будете использовать метод callback для чтения HTTP response.Каждый метод обратного вызова будет определенным для этого HTTP request и должен заботиться о себе.

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

Да, у вас может быть несколько невыполненных асинхронных запросов.JavaScript не является действительно однопоточным, как некоторые предполагают.Это часто встречается при использовании спящих функций.

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

Продолжайте, попробуйте спящую функцию и вызовите ее несколько раз, прежде чем первый запрос разрешится.Убедитесь, что ваши функции асинхронны.

Помните об ошибке похмелья.Вызов функции более одного раза не отклонит предыдущий запрос.Это можно увидеть в рабочем примере здесь: https://codepen.io/anon/pen/Jmpcq/?editors=101

Время ожидания в конечном итоге наступит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...