سؤال

أنا في محاولة لمعرفة طريقة جيدة للحد من المعدل الذي أرسل الكود الجغرافي يطلب خرائط جوجل API v3 القالب الخدمة.أنا أعرف أن جافا سكريبت ليس لديها أي لطيفة wait أو sleep لأن الإعدام في الوقت الراهن ، واحدة مترابطة.

كل القالب يتم إرسال طلب داخل مسج each وظيفة.حتى العامة رمز الهيكل العظمي هو:

$(xml).find('foo').each(function(){
    // do stuff
    ...

    geocoder.geocode(request, function(results, status) {/* do other stuff */});

    // do more stuff
    ...
}

كيف يمكنني تعيين ثابت فترة الانتظار بين كل مكالمة geocode?إذا كنت ترسل كل طلب بأسرع جافا سكريبت تشغيل ، ثم سرعان ما تبدأ في تلقي OVER_QUERY_LIMIT الردود - حتى إذا أنا فقط إرسال 20 الطلبات.هذا هو المتوقع, و أنا أحاول أن أجعل العميل اللعب بشكل جيد مع خدمة جوجل.


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

ومع ذلك ، لم أتمكن من العثور على طريقة لاستخدام جوجل خدمة الترميز الجغرافي (على وجه التحديد ، وذلك باستخدام الإصدار 3 من API) في جاوة. GeoGoogle يبدو أن أكثر من سنة من التاريخ ، ويستخدم v2.

يمكن أن يتم ذلك في جاوة ، وإذا كان الأمر كذلك ، كيف ؟

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

المحلول

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

نصائح أخرى

تقوم Google بتطوير بنشاط V2 و V3 من API الخرائط بشكل منفصل. V3 هي نسخة مفرغة بكثير مناسبة للأجهزة ذات طاقة معالجة محدودة أو مهام رسم الخرائط الأساسية (ولا تحتاج إلى مفتاح API للعمل).

في كلتا الحالتين، إذا كنت تقوم بتركيب أشياء كثيرة، فمن المحتمل أن تنظر إليها باستخدام خدمة Google HTTP Geocoding (http://code.google.com/apis/maps/documentation/geocoding/index.html.). هذا سوف يتجنب قضية الحد من الأسعار.

و FWIW: يمكن لجافا سكريبت القيام بعمليات النوم / الانتظار الأساسية باستخدام setinterval () و pettimeout (). فقط قم بإطلاق الطلب وإعادة ضبط المؤقت للقيام بذلك مرة أخرى في نهاية معالجة رد الاتصال الخاص بك.

هنا مقتطف من البرنامج النصي، في الأساس يحاول مرة أخرى إذا كان يضرب google.maps.geocoderstatus.over_query_limit

function(results, status) {
    // If the limit is reached try again in a second
        if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {

            window.setTimeout(
                function() {self.resolveAddress(addr);},1000
            );
        } else if (status == google.maps.GeocoderStatus.OK) {
            // Do something clever
        } else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
            self.reduce(addr); // Try removing something from addr
        } else {
            atira.log('Something terrible happened');
        }
    });
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top