AJAX कॉल ओवरलैपिंग रोकने के लिए मैं टाइमर कैसे सेट करूं?

मेरे पास एक ऐसा पृष्ठ है जहां खोज रिजल्ट दोनों ग्रिड और मानचित्र पर दिखाए जाते हैं (फ्लाई पर जेनरेट किए गए केएमएल का उपयोग करके, एम्बेडेड Google मानचित्र पर ओवरलैड)। मैंने इसे उपयोगकर्ता प्रकार के रूप में काम करने के लिए तार दिया है; यहां मेरे कोड का कंकाल है, जो काम करता है:

$(function() {
   //Wire up search textbox
    $('input.Search').bind("keyup", update);
});

update = function(e) {
   //Get text from search box
   //Pass to web method and bind to concessions grid
    $.ajax({  
        ...
        success: function(msg) {
            displayResults(msg, filterParams);
        },
    });

}

displayResults = function(msg, filterParams) {
       //Databind results grid using jTemplates
       //Show results on map: Pass parameters to KML generator and overlay on map
}

खोज के आधार पर, सैकड़ों परिणाम हो सकते हैं; और इसलिए displayResults में जो काम होता है वह सर्वर पर प्रोसेसर-गहन है (डेटाबेस से पूछताछ, फ्लाई पर केएमएल का निर्माण और सरलीकृत करना) और क्लाइंट पर (परिणाम ग्रिड को डाटाबेस करना, बड़े केएमएल को ओवरले करना मानचित्र पर फाइलें)।

मुझे टाइप करते समय प्रगतिशील संकुचित परिणाम प्राप्त करने की तत्कालता पसंद है, लेकिन मैं इस रीफ्रेश की संख्या को कम करना चाहता हूं। अद्यतन फ़ंक्शन चलाने से पहले, उपयोगकर्ता टाइपिंग बंद करने के बाद एन-सेकंड विलंब को प्रस्तुत करने का सबसे आसान तरीका क्या है?

1

3 उत्तर

update() को सीधे कॉल करने के बजाय, एक रैपर को कॉल करें जो यह देखने के लिए जांच करता है कि कोई लंबित देरी अपडेट है या नहीं:

$('input.Search').bind("keyup", delayedUpdate);

function delayedUpdate() {
    if (updatePending) {
        clearTimeout(updatePending);
    }

    updatePending = setTimeout(update, 250);
}

function update() {
    updatePending = false;

    //$.ajax(...
}

आपको शायद यह भी जोड़ना चाहिए:

$('input.Search').bind("blur", update);

जब उपयोगकर्ता फ़ील्ड छोड़ देता है तो यह तत्काल अपडेट करेगा। लेकिन सुनिश्चित करें कि आप उस मामले के लिए हैंडलिंग भी जोड़ते हैं जहां लंबित देरी अपडेट होने पर उपयोगकर्ता फ़ील्ड छोड़ देता है (पहले देरी अपडेट को रद्द करें)।

3
जोड़ा
यह पूरी तरह से काम करता है - धन्यवाद।
जोड़ा लेखक Herb Caudill, स्रोत

पहले दृष्टिकोण के रूप में, कुछ इस बारे में क्या है:

$('input.Search').bind("keyup", function() { setTimeout(update, 5) } );

(सटीक सेटटाइमआउट वाक्यविन्यास के बारे में निश्चित नहीं है)।

आप यह भी ट्रैक करने के लिए एक चर रख सकते हैं कि टाइमआउट पहले ही निर्धारित हो चुका है या नहीं।

0
जोड़ा
यह 5 मिलीसेकंड की प्रतीक्षा के बाद, प्रभावी रूप से अनावश्यक लोड की मात्रा को प्रभावी ढंग से ले जाएगा।
जोड़ा लेखक Ates Goral, स्रोत

आप Window.SetTimeOut (YourRefreshMethod) का उपयोग कर सकते हैं, जब YourRefereshMethod को कॉल किया जाता है, यह अब तक टाइप किए जा रहे वर्णों की संख्या की जांच करेगा, और इसे कुछ काउंटर से तुलना करेगा, काउंटर 0 मान से शुरू होगा, इसलिए प्रारंभिक कॉल कुछ भी नहीं करेगा मौजूदा वर्णों के साथ काउंटर को अपडेट करने के अलावा काउंटर को अपडेट करने के अलावा, दूसरी बार आपकी विधि को कॉल करने के बाद, यह टाइप किए गए वर्णों की संख्या की जांच करेगा, अगर यह काउंटर द्वारा दर्ज किए गए पिछले नंबर से मेल खाता है, तो इसका मतलब है कि उपयोगकर्ता ने कुछ भी टाइप नहीं किया है नया और आप अपनी ताज़ा विधि को आग लगा सकते हैं, अन्यथा आप काउंटर वैल्यू अपडेट करेंगे

0
जोड़ा