تمر الدولة إلى الاستدعاء في جافا سكريبت الاستخدام المناسب الإغلاق؟

StackOverflow https://stackoverflow.com/questions/251313

  •  05-07-2019
  •  | 
  •  

سؤال

لنفترض أنك تريد تقديم طلب المتزامن في جافا سكريبت، ولكن تريد تمرير بعض الدول جنبا إلى جنب إلى أسلوب الاستدعاء. هو بعد الاستخدام الملائم للإغلاق في جافا سكريبت؟

function getSomethingAsync(someState, callback) {
    var req = abc.createRequestObject(someParams);
    req.invoke(makeCallback(someState, callback));
}

function makeCallback(someState, callback) {
    return function getSomethingCallback(data) {
        var result = processDataUsingState(data, someState);
        callback(result); // alternately/optionally pass someState along to result
    }
}

إذا لم يكن كذلك، هل هناك طريقة أفضل أو أكثر الاصطلاحية؟

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

المحلول

وأنا لا أرى أي مشاكل فورية مع هذا - إغلاق قوية لأسباب عديدة، واحدة منها وإزالة الحاجة إلى استخدام المتغيرات العالمية لصيانة الدولة

.

وقال أن الشيء الوحيد الذي عليك أن نكون حذرين من فيما يتعلق الإغلاق هو تسرب الذاكرة التي تحدث عادة في IE، ولكن هذه هي عادة، IIRC، المتعلقة بالعناصر DOM ومعالجات الأحداث المرفقة بها.

والمضي قدما!

نصائح أخرى

والطريقة أكثر الاصطلاحية هي استخدام Function.bind ، ثم لا تحتاج لتكرار رمز لإنشاء الإغلاق. سوف تستخدم مثال بسيط (ليس لديها التعليمات البرمجية المخصصة) لشرح

/**
 * Retrieves the content of a url asyunchronously
 * The callback will be called with one parameter: the html retrieved
 */
function getUrl(url, callback) {
    $.ajax({url: url, success: function(data) {
        callback(data);
    }})    
}

// Now lets' call getUrl twice, specifying the same 
// callback but a different id will be passed to each
function updateHtml(id, html) {
    $('#' + id).html(html);
}


// By calling bind on the callback, updateHTML will be called with 
// the parameters you passed to it, plus the parameters that are used
// when the callback is actually called (inside )
// The first parameter is the context (this) to use, since we don't care,
// I'm passing in window since it's the default context
getUrl('/get/something.html', updateHTML.bind(window, 'node1'));
// results in updateHTML('node1', 'response HTML here') being called
getUrl('/get/something-else.html', updateHTML.bind(window, 'node2'));
// results in updateHTML('node2', 'response HTML here') being called

وFunction.bind هو جديد حتى إذا كنت بحاجة إلى الوراء دعم، أن ننظر في قسم التوافق من <لأ href = "https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind" يختلط = "نوفولو "> Function.bind

وأخيرا، وأنا أعلم لم الموسومة مسألة ما مسج. وكان هذا مجرد أسرع طريقة لإظهار وظيفة غير متزامن دون التعامل مع القضايا عبر متصفح

وفي أفضل (أجمل) لاستخدام وظائف مجهول:

function getSomethingAsync (someState, callback) {
    req.invoke (function (data) {
       var result = processDataUsingState (data, someState);
       callback (result);
    });
}

ويمكنك أيضا التحكم في قيمة "هذا" في وظيفة مع دعوة () / تطبيق ().

وعلى سبيل المثال، تحديد أن حجة إضافية لطريقة المتزامن الخاص بك هو كائن لاستخدام "هذا" في الاستدعاء. هذه هي الطريقة التي يحدد مسج عقدة دوم أن يكون "هذا" في الاسترجاعات الحدث.

function getSomethingAsync(callback, scope) {
    var req = abc.createRequestObject(someParams);
    req.invoke(function(rsp) {
      callback.apply(scope, [rsp]);
    });
}

// usage:
getSomethingAsync(function() {console.log(this.someState)}, {someState:'value'});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top