Как осуществить рефакторинг эту анонимную функцию JavaScript?

У нас есть эта анонимная функция в нашем коде, который является частью параметров объекта Ajax jQuery и который использует некоторые переменные от функции, от которой это называют.

this.invoke = function(method, data, callback, error, bare) {
      $.ajax({
        success: function(res) {
            if (!callback) return;

            var result = "";
            if (res != null && res.length != 0)
                var result = JSON2.parse(res);

            if (bare)
            { callback(result); return; }

            for (var property in result) {
                callback(result[property]);
                break;
            }
        }
   });
}

Я опустил дополнительный код, но Вы получаете идею. Превосходные работы кода, но это пропускает 4 КБ на каждом вызове в IE, таким образом, я хочу осуществить рефакторинг его для превращения анонимной функции в именованную, как this.onSuccess = функция (res) {..}.

Проблема состоит в том, что эта функция использует переменные от this.invoke (..), таким образом, я не могу только взять его за пределами его тела. Как я правильно осуществляю рефакторинг этот код, так, чтобы он не использовал анонимные функции и породил функциональные переменные?

Обновление. Я думаю о создании отдельного объекта, инициализируя его с теми же параметрами, и передаю его функцию onSuccess в качестве параметра для объекта Ajax jQuery. Хотя я подозреваю, что это все еще пропустит память.

Обновление 2. Я нашел несколько ссылок, предполагающих, что фактическая утечка могла бы быть вызвана jQuery. Простой Ajax jQuery называет память утечек в Internet Explorer Утечка памяти, включающая запросы Ajax jQuery

Тем не менее было хорошо найти способ осуществить рефакторинг это.

Обновление 3. Я буду ожидать более универсального решения, прежде, чем принять ответ.

15
задан Community 23 May 2017 в 12:08
поделиться

2 ответа

Вы можете добавить дополнительные параметры к ajax-запросу, к которым можно получить доступ в обратном вызове success:

this.invoke = function(method, data, callback, error, bare) {
    $.ajax({
        success: onSuccess,
        invokedata: {
         callback: callback,
         bare: bare
        }
    });
};

var onSuccess = function(res) {
    var callback = this.invokedata.callback,
        bare = this.invokedata.bare;
    if (!callback) return;

    var result = "";
    if (res != null && res.length != 0)
        var result = JSON2.parse(res);

    if (bare){
        callback(result); 
        return;
    }

    for (var property in result) {
        callback(result[property]);
        break;
    }
}
10
ответ дан 1 December 2019 в 04:34
поделиться

+1 за отличный, отличный вопрос - Я чувствую вашу боль - это действительно хорошо продумано и так.

Одно предложение (и, возможно, это то, что вы имели в виду под своим обновлением) ... определить оболочку для onSuccess и заставить ее возвращать функцию, которую вы хотите назначить. Затем вызовите внешнюю функцию и присвойте ей параметр «success», передав необходимые ей значения. Эти значения будут предварительно присвоены переменным во внутренней функции. Не совсем уверен, поможет ли это - вы все равно получите анонимную функцию - но стоит попробовать

this.invoke = function(method, data, callback, error, bare) {
    $.ajax({
        success: onSuccess(callback, bare);
    });
};

var onSuccess = function(callback, bare) {
     return function() {
        if (!callback) return;

        var result = "";
        if (res != null && res.length != 0)
            var result = JSON2.parse(res);

        if (bare)
        { callback(result); return; }

        for (var property in result) {
            callback(result[property]);
            break;
        }
     }
}
4
ответ дан 1 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: