यह मूर्खतापूर्ण प्रतीत होता है, लेकिन मुझे यह नहीं पता कि jQuery के साथ एसिंक्रोनस फ़ंक्शन कॉल कैसे करें जिसमें कुछ सर्वर-साइड अनुरोध शामिल नहीं है। मेरे पास धीमा कार्य है जो बहुत से डोम तत्वों के माध्यम से पुनरावृत्त करता है, और मैं चाहता हूं कि यह कार्य चल रहा है, जबकि ब्राउज़र चालू नहीं हो रहा है। धीमे फ़ंक्शन को कॉल करने से पहले मैं थोड़ा संकेतक प्रदर्शित करना चाहता हूं, फिर जब धीमा फ़ंक्शन वापस आता है, तो मैं सूचक को छिपाना चाहता हूं। मैं निम्नलिखित है:jQuery एसिंक्रोनस फ़ंक्शन कॉल, कोई AJAX अनुरोध
$('form#filter', parentNode).submit(function() {
var form = $(this);
indicator.show();
var textField = $('input#query', form);
var query = jQuery.trim(textField.val());
var re = new RegExp(query, "i");
slowFunctionCall(); // want this to happen asynchronously; all client-side
indicator.hide();
return false;
});
वर्तमान में मैं पत्र भरना होगा और संकेतक प्रदर्शित नहीं किया जाता है, ब्राउज़र जम जाता है, और फिर slowFunctionCall
समाप्त हो गया है।
संपादित करें: मैं Vivin's answer विशेष रूप से Sitepoint link इस्तेमाल किया है, तो निम्न समाधान पाने के लिए:
var indicator = $('#tagFilter_loading', parentNode);
indicator.hide();
var spans = $('div#filterResults span', parentNode);
var textField = $('input#query', parentNode);
var timer = undefined, processor = undefined;
var i=0, limit=spans.length, busy=false;
var filterTags = function() {
i = 0;
if (processor) {
clearInterval(processor);
}
indicator.show();
processor = setInterval(function() {
if (!busy) {
busy = true;
var query = jQuery.trim(textField.val()).toLowerCase();
var span = $(spans[i]);
if ('' == query) {
span.show();
} else {
var tagName = span.attr('rel').toLowerCase();
if (tagName.indexOf(query) == -1) {
span.hide();
}
}
if (++i >= limit) {
clearInterval(processor);
indicator.hide();
}
busy = false;
}
}, 1);
};
textField.keyup(function() {
if (timer) {
clearTimeout(timer);
}
/* Only start filtering after the user has finished typing */
timer = setTimeout(filterTags, 2000);
});
textField.blur(filterTags);
इस शो और सूचक को छुपाता है और यह भी ब्राउज़र जमता नहीं। आप काम करने के रूप में डोम तत्व छुपाए जाने के लिए देखते हैं, जो मैं जा रहा था।
मुझे लगता है कि सभी जेएस एक ही धागे में चलता है। तो अतुल्यकालिक कार्यों को चलाने के लिए संभव नहीं है। लेकिन मैं इसके बारे में गलत हो सकता हूं :) – PeeHaa
इस बात पर निर्भर करते हुए कि आप अपने कार्य को धीमा कर रहे डीओएम तत्वों को कैसे एक्सेस कर रहे हैं, आप इस भाग को तेज़ी से बढ़ा सकते हैं। क्या आप वर्ग या विशेषता फ़िल्टर (धीमी) का उपयोग कर JQuery के तत्वों तक पहुंच रहे हैं? क्या फ़ंक्शन एक से अधिक बार चलता है और क्या कोई तरीका है कि आप उन तत्वों/आईडी को कैश कर सकते हैं जिनके साथ आप बातचीत कर रहे हैं? क्या आप एक सीएसएस वर्ग को बदलकर एक ही डोम अपडेट कर सकते हैं जो सभी प्रभावित तत्वों का उपयोग करते हैं? – tomfumb