javascript - لغة - شرح جافا سكربت بالعربي pdf




جافا سكريبت تعيين قيمة إرجاع دالة استدعاء إلى المتغير العام (4)

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

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

  if (coord) // global variable has a new value
    // process it
     alert('code: '    + error.code    + '\n' +
          'message: ' + error.message + '\n');
    // then clear it
    coord = null;
  } 

سؤالي حول جافا سكريبت. لدي وظيفة الاستدعاء الذي يتلقى كائن موضع على استدعاء ناجحة.

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

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

وهنا رمز مبسط.

var x;

navigator.geolocation.getCurrentPosition(onSuccess, onError);

//on Successful callback receives a Position Object
function onSuccess(position) {  
  var coords = position.coords;  
    x=coords;       // Setting directly to an object does not work x still remains undefined after succesful callback               
return coord; // Trying to set this to a global object 

}

// onError Callback receives a PositionError object
//
function onError(error) {
    alert('code: '    + error.code    + '\n' +
          'message: ' + error.message + '\n');
}

لا يمكنك إرجاع قيمة من رد الاتصال (في هذه الحالة). وهذا يعني أن داخل getCurrentPosition ، يجب أن يتم تعيين قيمة العودة من رد الاتصال في مكان ما.

تعيينه إلى متغير عالمي يعمل، ولكن في الوقت الذي الوصول إلى هذا المتغير، لم يتم تعيين القيمة الجديدة حتى الآن. على سبيل المثال

// x is assigned in `onSuccess`
var x;
navigator.geolocation.getCurrentPosition(onSuccess, onError);
alert(x); // will be undefined, the response is not processed yet

فكر في ذلك: getCurrentPosition على الأرجح القيام بطلب اياكس للحصول على الموقف. ويتطلب هذا الطلب (أ) الوقت (بضع مليثانية) وبسبب ذلك (ب) غير متزامن ، مما يعني أن جافاسكريبت لا تنتظر حتى يتم تلقي الرد. الرمز الخاص بك هو أسرع طريقة . لم يتم استدعاء onSuccess حتى عند تنبيه x .

الحل الوحيد:

كل التعليمات البرمجية التي يجب الوصول إلى الموقف كما في أو دعا من رد الاتصال.


وضع console.log(x); فقط بعد x=cords للتحقق من قيمة (يعمل على كروم و فف مع فيريبوج)

تفعل ذلك أيضا بعد دعوة أونسوتشس.

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


يمكنك تنفيذ طريقة المساعد مثل التدفق:

var LocationHelper = function() {};

LocationHelper.prototype.getLocation = function(callback) {

    navigator.geolocation.getCurrentPosition(onSuccess, onError);

    function onSuccess(pos) {
        callback({
            pos: pos
        });
    }

    function onError(message) {
        callback({
            message: message
        });
    }

  };




callback