2011-10-13 8 views
22

मेरे पास एक ईवेंट हैंडलर है, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि यह तब तक इंतजार करेगा जब तक कि ईवेंट कतार में अन्य सभी घटनाओं को निष्पादित नहीं किया जाता है।अन्य सभी घटनाओं को संभालने के बाद कोड कैसे चलाया जा सकता है

उदाहरण के लिए, मेरे पास एक पृष्ठ पर कुछ टैब हैं। मेरे पास टैब को संभालने के लिए कुछ सामान्य कोड है जो एक उपयोगकर्ता को "सक्रिय टैब" पर सेट करता है जब कोई उपयोगकर्ता उस पर क्लिक करता है।

$('a.tab').click(function() { 
    $(this).parent('div').find('a.tab').removeClass('activeTab'); 
    $(this).addClass('activeTab'); 
}); 

टैब का एक विशिष्ट सेट के लिए, मैं एक हैंडलर हो सकता है:

// handler-1 
$('div#myTabs a.tab').click(function() { 
    do_something(); 
}); 

function do_something() { 
    var type = $('div#myTabs a.activeTab').data('type'); 
    do_something_else(type); 
} 

do_something() एक टैब पर क्लिक के अलावा अन्य कार्यों के जवाब में कहा जाता है हो सकता है, लेकिन यह कैसे की परवाह किए बिना आह्वान हो जाता है, यह जानना चाहता है कि सक्रिय टैब जारी रखने से पहले क्या है।

मेरी समस्या यह है कि अगर इसे '// हैंडलर -1' के तहत कोड द्वारा बुलाया जा रहा है, तो वर्ग 'activeTab' अभी तक रीसेट नहीं किया गया है, इसलिए 'टाइप' के लिए यह मान अभी भी पुनर्प्राप्त होगा इस पर क्लिक करने से पहले जो भी टैग चुना गया था उससे।

मैं इसे इस तरह हल:

// handler-1 
$('div#myTabs a.tab').click(function() { 
    set_timeout(function() { 
    do_something(); 
    }, 100); 
}); 

यह लग रहा है एक kludge की बहुत अधिक की तरह मुझे पूरा करने के। मुझे कैसे पता चलेगा कि टाइमर इवेंट हैंडलर को अन्य सभी हैंडलरों की बारी के बाद ही बुलाया जाएगा? निश्चित रूप से मैं "100" से "1000" या यहां तक ​​कि "10000" बदल सकता हूं लेकिन मैं अधिक निश्चितता के लिए प्रदर्शन प्रदर्शन भी करूँगा (और अभी भी कोई निश्चितता नहीं है क्योंकि 10 सेकंड भी एक मशीन पर ब्राउज़र उदाहरण पर पर्याप्त नहीं हो सकता है पर्याप्त अपंग)।

मैंने देखा है कई संभव समाधान:

लेकिन इनमें से कोई भी पर्याप्त रूप से सामान्य मुझे पूरा करने के हैं। मैं पहले चलाने के लिए एक हैंडलर प्राप्त करने की कोशिश नहीं कर रहा हूं। इसके बजाय, मुझे ऐसा कुछ चाहिए:

function do_something() { 
    $.when_all_other_events_have_been_handled(function() { 
    do_something(); 
    }); 
}); 

क्या ऐसा कुछ भी मौजूद है?

मैंने $ .fn.when (arg) .done() पर देखा, लेकिन कब? इस मामले में "तर्क" एक स्थगित ऑब्जेक्ट होना चाहिए जो कि पहले से ही कतार में जो भी हो, निष्पादित करता है। एक कैच -22!

स्प्राउटकोर में "engine.run()" (सटीक नाम याद नहीं है) की तरह कुछ है जो केवल तब वापस आ जाएगा जब "इंजन" में अन्य सभी घटनाओं को संभाला जा रहा है, लेकिन मुझे ऐसा कुछ नहीं मिल रहा है jQuery में। (http://api.jquery.com/category/events/)। अगर किसी को ऐसा कुछ पता है, तो कृपया मुझे बताएं!

धन्यवाद! :)

उत्तर

27

इस प्रयास करें।

+0

हे! तुमने मुझे अपने जवाब में मार दिया! –

+1

मैं इसे सकारात्मक टाइमआउट के साथ उपयोग कर रहा था और अनुमान लगाया कि यह एक दौड़ की स्थिति थी, इसे देखने के लिए खुशी हुई :) – Jake

+0

पोस्टपोन फ़ंक्शन का उपयोग करते समय त्रुटि हुई त्रुटि: त्रुटिहीन त्रुटि टाइमम कॉल (तर्क के आसपास गायब उद्धरण?) Ubuntu canonical के लिए फ़ायरफ़ॉक्स 20.0 में 1.0। @ Lsiden उत्तर मेरे लिए काम किया। –

25

मैं इस सवाल का जवाब यहाँ मिल गया है हो सकता है: http://ejohn.org/blog/how-javascript-timers-work/

जे के अनुसारResig, अगर मैं

setTimeout(function() { 
    do_something(); 
}, 0); 

करना गुमनाम समारोह तुरंत enqued हो जाएगी लेकिन जब तक घटना कतार पर सब कुछ पहले से ही नियंत्रित किया जा चुका है बुलाया नहीं किया जाएगा। यही वह समय है, जब तक कि जो भी ब्राउज़र चल रहा है वह वास्तव में पहले-इन-फर्स्ट-आउट आधार पर सब कुछ चलाता है क्योंकि मैं इसकी अपेक्षा करता हूं। यदि किसी भी कारण से जावास्क्रिप्ट इंजन स्वयं को कतार में घटनाओं को फिर से व्यवस्थित करने के लिए ले जाता है (मुझे नहीं पता कि यह क्यों होना चाहिए, लेकिन आप AFAIK के बाद कभी नहीं जानते हैं मैंने मानकों में ऐसी कोई गारंटी कभी नहीं देखी है, लेकिन फिर मैं फिर से देखने की जरूरत है) तो सभी दांव बंद हैं! यदि आप कॉल करेंगे postpone(do_something); कि do_something सभी यूआई घटनाओं postpone() कॉल के पल के लिए घटना कतार में हैं के बाद निष्पादित किया जाएगा तो

function postpone(fun) 
{ 
    window.setTimeout(fun,0); 
} 

:

+0

इस समय क्रोम के साथ इस व्यवहार को नहीं देख रहा है। मेरे पास 2 अलग-अलग फ़ंक्शन हैं जिन्हें चेकबॉक्स के "क्लिक" ईवेंट पर बुलाया जाता है। जिस पर मैं आखिरी चाहता हूं, मैंने इसे सेटटाइमआउट में लपेट लिया लेकिन अगर मैं इसे 0 पर सेट करता हूं .. यह दौड़ की स्थिति प्रतीत होता है। मैंने इसे 500 पर सेट किया और ऐसा लगता है, लेकिन मुझे डर है कि यह केवल भाग्य से है। – Dss

संबंधित मुद्दे