JQuery ajax успешный обратный вызов никогда не собирает мусор - PullRequest
1 голос
/ 24 апреля 2020

Пожалуйста, извините за мой забавный вид JS. Это скомпилированный сценарий Coffee.

Когда в моем WebApp происходит что-то определенное c, я запускаю следующую функцию обратного вызова, чтобы запустить запрос JSON get:


GmScreen.prototype.requestPcUpdate = function(id) {
      var currentUrl, self, url;
      currentUrl = window.location.href;
      url = currentUrl.substr(0, currentUrl.lastIndexOf('/')) + '.json';
      self = this;
      return $.ajax({
        url: "/chars/" + id + ".json",
        type: "GET",
        error: function() {
          return self.onPcUpdateError(this);
        },
        success: function(pc) {
          return self.onPcUpdateReceived(pc);
        }
      });
    };

Обратный вызов успеха Функция выглядит следующим образом:

GmScreen.prototype.onPcUpdateReceived = function(receivedPc) {
      var pcObj;
      if (!(receivedPc['id'] in this.allPcs)) {
        console.error("No PC with ID " + receivedPc['id'] + " known!");
      }
      pcObj = this.allPcs[receivedPc['id']];
      pcObj['cmlNode'] = new CmlCharacter((new DOMParser()).parseFromString(receivedPc['cml'], 'text/xml').documentElement);
      return this.notifyPcChangeListeners();
    };

В функции обратного вызова я создаю документ XML (и объект-оболочку на его основе) и назначаю его. Когда приходит следующее обновление для того же идентификатора, документ и объект-обертка могут быть собраны сборщиком мусора.

Но этого никогда не происходит.

В Firefox я вижу, что Dominator сохраняет это из-за сбора мусора происходит то, что называется mPromiseObj.

Firefox Dominator View

Это существенно влияет на производительность моего веб-приложения с течением времени. Как я могу удалить эту вещь?

1 Ответ

0 голосов
/ 26 апреля 2020

Оказывается, я облажался мои обратные вызовы. По причине notifyPcChangeListeners был создан новый прослушиватель, который в конце концов вызвал бы onPcUpdateReceived.

Так что предотвращение очистки этого мусора абсолютно корректно.

...