2009-09-20 8 views
6

मैं एक सर्वव्यापी प्लगइन लिख रहा हूं, एक AJAX क्वेरी के लिए लंबे फ़ंक्शन कॉलबैक को जीयूआई थ्रेड को अवरुद्ध कर रहा है जिससे फ़ायरफ़ॉक्स लॉक हो जाता है।क्या जावास्क्रिप्ट में सहकारी थ्रेडिंग भावना में 'उपज' का कोई सही तरीका है?

स्पष्ट समाधान बाहर ले जाया गया के (यानी हम समय-समय पर अन्य आदेशों जोड़ने घटना कतार के अंत करने के लिए इस क्वेरी समारोह कर बाहर ले जाने और उसके बाद की अनुमति देना चाहते आस्थगित निष्पादन में किसी प्रकार का उपयोग करने के लिए होने लगते हैं ।

एक ही रास्ता मैं यह कर के बारे में सोच सकते हैं शून्य का समय समाप्त साथ setTimeout का उपयोग करने के लिए है कि यह काम करने के लिए गारंटी है के साथ setTimeout का उपयोग करना है ..., या ऐसा करने का एक बेहतर तरीका है।

+0

आप AJAX कैसे कर रहे हैं? यदि आप एक स्क्रिप्ट टैग लोड कर रहे हैं, जो अवरुद्ध हो सकता है (स्क्रिप्ट वापस आने तक ब्राउज़र ब्लॉक)। –

+0

मैं jQuery.get – user47741

उत्तर

7

एक बहुत छोटा टाइमआउट (0 या बहुत करीब शून्य अगर आप पागलपन महसूस कर रहे हैं) ब्राउज़र संदर्भ में ऐसा करने का एकमात्र तरीका है। बहुत अच्छी तरह से काम करता है और बहुत विश्वसनीय है, लेकिन अक्सर पर्याप्त उत्पादन करना सुनिश्चित करें, लेकिन भी अक्सर, क्योंकि इसमें कुछ समय लगता है (कंप्यूटर समय में "थोड़ी देर"; यह मानव शब्दों में लगभग तात्कालिक [मॉड्यूल अन्य चीजें जो आप कर सकते हैं] है)।

+2

का उपयोग कर रहा हूं सभी आधुनिक ब्राउज़र कार्यान्वयन ने सेटटाइमआउट को ~ 10ms (मूल रूप से सभी गैर-विंडोज सिस्टम पर 10ms पर क्लैंप किया है, जहां <16ms टाइमर प्राप्त करने के लिए आवश्यक टाइमर रिज़ॉल्यूशन में महत्वपूर्ण पावर उपयोग प्रभाव होता है)। इसलिए आपको टाइमआउट को कम करने के बारे में चिंता करने की ज़रूरत नहीं है। – olliej

+1

@olliej: यह पुरानी जानकारी है (यदि यह '0 9 में सही था, लेकिन यह तब मेरा अनुभव नहीं था)। 'सेटटाइमआउट' कॉल की उत्पत्ति के आधार पर ब्राउजर उस से अधिक परिष्कृत हैंडलिंग करते हैं। यह [कुछ साल पहले एचटीएमएल 5 spec में कोडित किया गया था] (http://www.w3.org/TR/html5/webappapis.html#timer-initialization-steps) लेकिन जैसा कि मैंने कहा, विक्रेता पहले ही खेल रहे थे (अलग) पहले से खेल। लघु संस्करण: यदि आपका कोड टाइमर द्वारा नहीं कहा गया था, तो आप 0 का उपयोग कर सकते हैं, और आधुनिक ब्राउज़र को ** बहुत ** प्राप्त होगा। –

3

सुनिश्चित करें कि आप एक सिंक्रोनस अनुरोध के रूप में एक सिंक्रोनस अनुरोध का उपयोग कर रहे हैं ब्राउज़र (जो जीयूआई लॉक-अप समझाएगा) को अवरुद्ध करता है।

यदि यह आपकी समस्या नहीं है, तो मुझे लगता है कि आप इस कार्य कतार की तरह कुछ चाहते हैं।

var queue = []; 

queue.push(someTaskFunction); 
queue.push(anotherTaskFunction); 
// ... 

var runQueue = (function() { 
    var len = queue.length, task = 0; 
    for (; task < len; task++) { 
     yield queue[task](); 
    } 
}()); 

अगले कार्य को निष्पादित करने के लिए runQueue.next() पर कॉल करें। कोशिश करें .. कैच स्टेटमेंट को इस तरह से लपेटें:

try { 
    runQueue.next(); 
} catch (e if (e instanceof StopIteration)) {} 
+0

कॉल asyncrhonous – user47741

+0

कूल है - मुझे पता नहीं था कि जनरेटर जावास्क्रिप्ट में जोड़े गए थे। क्या मैं यह समझने में सही हूं कि जब भी फ़ंक्शन वापस आता है तो अन्य कार्य नियंत्रण ले सकते हैं? – user47741

+0

ध्यान दें कि जेनरेटर जावास्क्रिप्ट के लिए अपेक्षाकृत नए हैं और जरूरी रूप से समर्थित नहीं हैं। –

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

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