Подтвердить что ты не робот

Повторно использовать объект XMLHttpRequest или создать новый?

Я искал stackoverflow, но получил противоречивые ответы:

Почему я должен повторно использовать объекты XmlHttpRequest?

Страница, интенсивно использующая Ajax: повторно использовать один и тот же объект XMLHttpRequest или каждый раз создавать новый?

Также есть рекомендация w3schools.com:

Если на вашем сайте есть несколько задач AJAX, вы должны создать ОДНА стандартная функция для создания объекта XMLHttpRequest и вызова это для каждой задачи AJAX.

Почему эта рекомендация? Вместо этого я использую глобальный объект XMLHttpRequest на моей странице для обработки всех задач Ajax.

4b9b3361

Ответ 1

Вы неправильно поняли рекомендацию W3School. Я выделим соответствующую часть:

Если на вашем сайте задано несколько задач AJAX, вы должны создать ОДНА стандартную функцию для создания объекта XMLHttpRequest и вызвать это для каждой задачи AJAX.

В нем говорится, что вы используете одну функцию AJAX для извлечения запросов. Эта функция будет иметь дело с несоответствиями между IE и другими браузерами. XMLHttpRequest в стандартном браузере и ActiveXObject в IE.

Я рекомендую использовать несколько объектов XHR. С одним глобальным объектом xhr ваше приложение может обрабатывать только один запрос в данный момент времени. Он также подвержен ошибкам (например, XMLHttpRequest запускается несколько раз, не инициируя функцию onreadystatechange).

W3schools означало что-то вроде:

function createXHR() {
    try {
        return new XMLHttpRequest();
    } catch (e) {
        try {
            return new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
            return new ActiveXObject("Msxml2.XMLHTTP");
        }
    }
}
var xhr = createXHR();
xhr.open('get', '/test', true);
xhr.send();

Хотя лучше создать функцию, которая обрабатывает запросы, такие как jQuery.ajax.

Ответ 2

Лучше всего использовать разные объекты для каждого XHR, который вы создаете. Даже если есть способ сделать это, избегайте этого! Нет проблем с созданием нового объекта для каждого запроса. Если вас беспокоит утечка памяти или что-то в этом роде, не беспокойтесь, все они должным образом соответствуют GC.


Если на вашем сайте задано несколько задач AJAX, вы должны создать стандартную функцию ONE для создания объекта XMLHttpRequest и вызвать это для каждой задачи AJAX.

Это на самом деле означает, что у вас есть одна функция, которая создает новый объект и возвращает его каждый раз, когда вы его вызываете. Это что-то вроде:

function newXHR(){
    return a new instance of XHR();
}

Ответ 3

Рекомендуемая вам рекомендация заключается в том, что вы должны иметь один FUNCTION, который обрабатывает AJAX, а не только один объект XMLHTTPRequest.

Я бы использовал другой для каждого вопроса.

Общий аргумент против этого касается накладных расходов, связанных с созданием XHR. Однако это будет в значительной степени незначительным на любом сайте, который использует AJAX, как он был предназначен (т.е. Не как заменитель для веб-сокетов), и, в любом случае, многие из тех же накладных расходов будут применяться при повторном использовании XHR. Вам все равно придется открывать соединение, запускать его, подключать слушателей и т.д.

Браузеры различаются в зависимости от того, сколько шлюзов соединений разрешено в данный момент времени, поэтому в браузере можно контролировать, какие XHR могут что-то сделать. Другими словами, вам не нужно беспокоиться об управлении этим аспектом.

Наконец, ничто не мешает вам вручную удалять XHR после того, как вы их использовали, при условии, что они будут удалены (свойства объекта, а не переменные).