2013-09-03 2 views
2

Я храню объекты jquery ajax внутри массива, чтобы я мог вручную отменить вызов, если он не был возвращен, на основе событий, инициированных пользователем. Это ajax-вызовы, которые я ожидаю запустить долго.Объект jqXHR удаляет себя и контейнер из массива

JavaScript

var ajaxCalls = []; 
ajaxCalls[0] = $.ajax({...}); 

$("#cancelButton").on("click", function() { ajaxCalls[0].abort(); }); 

Проблема, которая существует в том, что объект jqXHR исчезает из массива после метод прерывания() вызывается.

Теперь это выглядит отлично, когда дело доходит до управления памятью моих объектов, поскольку оно волшебным образом удаляет себя и очищает красиво. Тем не менее, он оставляет анти-шаблон в моем коде, где, похоже, я не убираюсь после себя. Он также побеждает цель создания метода удаления сопутствующего метода для моего метода добавления.

Есть ли причина для этого? Если мой массив содержит более одного объекта, он полностью изменяет размеры.

Этот массив, если буквы были jqXHR объекты

['a', 'b', 'c', 'd'] 

становится этот массив, когда jqXHR объект «б» завершает

['a', 'c', 'd'] 

Чтение кода, можно было бы ожидать, что это произойдет

['a', null/undefined, 'c', 'd'] 

ПОЧЕМУ?

EDIT:

Вот скрипка, что я смог воспроизвести то, что я делаю.

В качестве прямого элемента массива:

[ jqXHR, jqXHR, jqXHR ] 

http://jsfiddle.net/itanex/uHX8q/

В качестве ключевого элемента объекта Значение в массиве:

[ { key: "key", value: jqXHR }, { key: "key", value: jqXHR } ] 

http://jsfiddle.net/itanex/7DSrg/

+0

Если я вас правильно понял, я не вижу, что поведение здесь: http://jsfiddle.net/KXjam/. –

+0

Я делал это несколько раз в разных проектах и ​​никогда не имел этой проблемы. Я также тестировал его каждый раз, когда я могу вспомнить последние 15 минут здесь -> http://jsfiddle.net/6Rq7J/ и не может воспроизвести эту проблему вообще, объект XHR всегда доступен после прерывания и никогда не удалялся из массива автоматически? – adeneo

+0

Мне нелегко было попытаться получить пример этого, не создавая службу для вызова, которая целенаправленно имеет длительный срок, чтобы иметь возможность продемонстрировать это. – itanex

ответ

2

В complete обратного вызова запускается при прервать вызов. Так получилось:

ajaxCalls.pop(); 

И вот ваш объект jqXHR.

Добавлен console.log показать pop:

http://jsfiddle.net/ycpZc/

+0

Так что я просто запутался в «Великом плетении», которое я сделал. Угадайте, что это комбинация выходных и четкое представление о коде, который показывает, что при всех асинхронных действиях мой объект очищался, как я настраивал. – itanex

Смежные вопросы