سؤال

لدينا هذه الوظيفة المجهولة في الكود الخاص بنا ، والتي تعد جزءًا من معلمات كائن 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 ، لذلك أريد إعادة تدويرها لتحويل الوظيفة المجهولة إلى واحدة مسماة ، مثل هذا.

المشكلة هي أن هذه الوظيفة تستخدم المتغيرات من هذا. invoke (..) ، لذلك لا يمكنني أخذها خارج الجسم. كيف يمكنني إعادة صياغة هذا الرمز بشكل صحيح ، بحيث يكون ذلك لا استخدام وظائف مجهولة ومتغيرات وظيفة الوالدين؟

تحديث. أفكر في إنشاء كائن منفصل ، وتهيئته بنفس المعلمات ، وأمر وظيفة onsuccess كمعلمة لكائن AJQuery الخاص بـ JQuery. على الرغم من أنني أظن أنه سيظل تسرب الذاكرة.

تحديث 2. لقد وجدت بعض الروابط التي تشير إلى أن التسرب الفعلي قد يكون سببها jQuery.Simple JQuery Ajax Call Call Memory في Internet Explorer تسرب الذاكرة تتضمن طلبات jQuery Ajax

لا يزال من الجيد إيجاد طريقة لإعادة تشكيل هذا.

تحديث 3. سأنتظر حل أكثر عامة ، قبل قبول إجابة.

هل كانت مفيدة؟

المحلول

يمكنك إضافة معاملات إضافية إلى طلب AJAX الذي يمكن الوصول إليه في رد الاتصال الناجح:

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;
    }
}

نصائح أخرى

+1 للحصول على سؤال ممتاز وممتاز - أشعر بألمك - هذا أمر رائع حقًا كما هو.

اقتراح واحد (وربما هذا هو ما قصدته بالتحديث الخاص بك) ... حدد غلافًا لـ OnSuccess وجعله يعيد الوظيفة التي تريد تعيينها. ثم اتصل بالوظيفة الخارجية وقم بتعيينها إلى خيار "النجاح" ، ومرر القيم التي يحتاجها. سيتم تعيين هذه القيم مسبقًا للمتغيرات في الوظيفة الداخلية. لست متأكدًا في الواقع مما إذا كان هذا سيساعد - لا يزال ينتهي بك الأمر بوظيفة مجهولة - ولكن يستحق المحاولة

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;
        }
     }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top